C++ 从零单排(1)-基础知识一

发布时间:2020-08-06 00:37:41 作者:拳四郎
来源:网络 阅读:392

最近发现一个挺有意思的东西,一问一答-http://wenda60.com/。

我这水平也就敢冲一下C++了,下面是一些记录。


默认this指针

this指针是一个特殊的指针,当类的某个非静态的成员函数在执行时,就会存在this指针。它指向类的一个对象,且这个对象的某个成员函数正在被调用。
this指针的名字始终是this,而且总是作为隐含参数传递给每一个被声明的成员函数。

实际编程时函数的声明不需要包含这个参数。

当程序中调用某个对象的成员函数时,编译器会把该对象的地址加入到参数列表中。

静态成员函数不存在this指针。

当调用某个对象的成员函数时,编译器把对象的地址传递给this指针,然后再调用该函数。因此,成员函数你对任何成员的调用实际上都隐式地使用了this指针。


类的继承规则

派生类共有三种C++类继承方式:公有继承(public),私有继承(private),保护继承(protected)

公有继承(public)

基类的公有成员和保护成员可以作为其派生类的公有成员和保护成员

派生类的成员函数可以访问基类中的公有成员和保护成员,无法访问基类中的私有成员

派生类的对象可以访问基类的公有成员

私有继承(private)

基类的公有成员和保护成员都作为其派生类的私有成员

在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承

保护C++类继承(protected)

基类的所有公有成员和保护成员都成为派生类的保护成员

基类的公有成员和保护成员只能被它的直接派生类成员函数或友元访问

构造函数和析构函数不能被继承

因此构造派生类的对象时,需要对基类数据成员.新增数据成员和成员对象的数据成员进行初始化

派生类构造函数的参数表部分既需要包含子类某些数据成员的初始值,也要包含基类的数据成员的初始值

如果基类没有默认的构造函数,那么派生类必须具有给基类构造函数提供参数的构造函数


数组指针和指针数组

--------------指针----------------
int a=10;
int *p=&a;

-------------指针的指针-----------
int b=20;
int *p=&b;
int **p2p=&p;

-------------简单数组-----------------
int c[10];//整数数组,含有10个整数元素
也就是说每一个元素都是整数

--------------指针数组--------------------
int *p[10];//指针数组,含有10个指针元素
也就是说每一个元素都是指针

--------------数组指针--------------------
int (*p)[10];//数组指针,这个指针可以用来指向
含有10个元素的整数数组


虚基类

虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。

在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如
c1.A::display( )。
在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的。C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员。


虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。

声明虚基类的一般形式为
class 派生类名: virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。

需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。

如果在派生类B和C中将类A声明为虚基类,而在派生类D中没有将类A声明为虚基类,则在派生类E中,虽然从类B和C路径派生的部分只保留一份基类成员,但从类D路径派生的部分还保留一份基类成员。

使用多重继承时要十分小心,经常会出现二义性问题。许多专业人员认为:不要提倡在程序中使用多重继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多重继承,能用单一继承解决的问题就不要使用多重继承。也是由于这个原因,有些面向对象的程序设计语言(如Java,Smalltalk)并不支持多重继承。


纯虚函数

定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。

包含纯虚函数的类称为抽象类,不能初始话为对象。


break,continue和return

break

位置:只能用在switch语句和循环语句中。

作用:跳出switch语句或提前终止循环,转去执行switch语句或循环语句之后的语句。

应用:多用于提前结束循环(包括省略形式的for循环),以避免死循环。


continue

位置:只能用在循环语句中。

作用:终止本次循环,即跳过其后尚未执行的循环体语句,并开始下一次循环。

区别:与break语句的区别是:continue语句结束本次循环,而break语句是结束整个循环。


return

位置:函数内部

return语句有两种形式:

return;

return expression;

不带返回值的return语句只能用于返回类型为void的函数,return语句是为了引起函数的强制结束,这种用法类似于循环结构中的break语句的作用。

返回类型为void的函数通常不能使用第二种形式的return语句,便是,它可以返回另一个返回类型同样是void的函数的调用

任何返回类型不是void的函数都必须返回一个值,而且这个返回值的类型必须和函数的返回类型相同,或者能隐式转化为函数的返回类型。

尽管C++不能确保结果的正确性,便能保证函数每一次return都返回适当类型的结果。


strlen和sizeof

char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前


char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2


类模板和函数模板

模板是实现代码复用的一种工具,它可以实现类型参数化,把类型定义为参数,实现代码的真正复用。

模板分两类:函数模板和类模板,用户可使用他们来构造模板函数或模板类。模板经过实例化后就得到模板函数或模板类,模板函数或模板类再经过实例化后就得到对象。

函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。

函数模板的数据类型参数标识符实际上是一个类型形参,在使用函数模板时,要将这个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。


类模板也称为类属类或类生成类,是为类定义的一种模式,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。类模板不是一个具体的类,它代表着一族类,是这一族类的统一模式。使用类模板就是要将它实例化为具体的类。

将类模板的模板参数实例化后生成的具体的类,就是模板类。


ofstream、ifstream和fstream

ofstream: 写操作(输出)的文件类 (由ostream引申而来)
ifstream: 读操作(输入)的文件类(由istream引申而来)
fstream: 可同时读写操作的文件类 (由iostream引申而来)

ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:

类 参数的默认方式
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。


常数据成员

类中的常数据成员的初始化,只能通过成员初始化列表的方式来进行。

用const修饰的定义对象称为常对象;
用const修饰的声明成员函数称为常成员函数;
用const修饰的声明数据成员称为常数据成员。
变量或对象被 const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。

声明方式:

const int cctwl;
int const cctwl;
int cctwl const; //这样是错误的只能有以上两种声明形式。不能省略数据类型,可以添加 public private等访问控制符


1.任何函数都不能对常数据成员赋值。
2. 构造函数对常数据成员进行初始化时也只能通过初始化列表进行。
3. 常数据成员在初始化时必须赋值或称其必须初始化.
4. 如果类有多个默认构造函数必须都初始化常数据成员。


先记下这几点,今天要冲到300分!

推荐阅读:
  1. cocos2d-x学习笔记(一)C++基础知识
  2. C++数组排序算法有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ c+

上一篇:4个影响缓存命中率的因素,你知道几个?

下一篇:在oracle linux6.5 (64bit)下搭建oracle11g r2 rac的注意事项

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》