C++ primer笔记----类

1、成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部;

2、this是一个常量指针,不允许改变this中保存的地址;默认情况下,this的类型时指向类类型非常量版本的常量指针;C++允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针;使用const的成员函数被称作常量成员函数;常量对象,以及常量对象的引用或指针都只能调用常量成员函数;成员函数体可以随意使用类中的其他成员而无需在意这些成员出现的次序;在类外部定义的成员的名字必须包含它所属的类名

3、与类相关的函数(非成员函数)虽然可以定义声明分开,但是需要将其声明与类放在同一个文件中,这样在使用接口时只需要引入一个文件即可;

4、类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数,构造函数的任务是初始化类对象的数据成员;构造函数的名字和类名相同;构造函数没有返回类型,有一个(可能为空的)参数列表和一个(可能为空的)函数体;类可以包含多个构造函数,但不同的构造函数之间必须在参数数量或参数类型上有所区别。

5、构造函数不能被声明成const的,构造函数在const对象的构造过程中可以向其写值;

6、类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,默认构造函数无须任何实参;编译器创建的构造函数又被称为合成的默认构造函数,它将按照如下规则初始化类的数据成员:
如果存在类内的初始值,用它来初始化成员;
否则,默认初始化该成员。

7、只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数;含有内置类型或复合类型的类应该在类的内部初始化这些成员,或者定义一个自己的默认构造函数,否则,用户在创建类的对象时就可能得到未定义的值;

8、C++11新标准中,如果需要默认的行为,那么可以通过在参数列表后面写上=default来要求编译器生成构造函数;其中,=default如果出现在类的内部,则默认构造函数是内联的,如果它在类的外部,则该成员默认情况下不是内联的;

9、Sales_data(const std::string &s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n){}
冒号以及冒号和花括号之间的代码为构造函数初始值列表,它负责为新创建的对象的一个或几个数据成员赋初值,构造函数初始值是成员名字的一个列表,每个名字后面紧跟括号括起来的(或者在花括号内的)成员初始值,不同成员的初始化通过逗号分隔开来。

10、构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值与原值不同,如果你不能使用类内初始值,则所有构造函数都应该显式地初始化每个内置类型的成员;

11、C++中使用访问说明符加强类的封装性:
定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口;
定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装(隐藏了)类的实现细节。

12、类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元(friend),如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可;

13、编译器处理完类中的全部声明后才会处理成员函数的定义。

14、如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值;

15、委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,此时成员初始值列表只有一个唯一的入口,就是类名本身;

16、默认初始化在一下情况下发生:
当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组时;
当一个类本身含有类类型的成员且使用合成的默认构造函数时;
当类类型的成员没有在构造函数初始值列表中显式地初始化时;

17、值初始化在以下情况下发生:
在数组初始化的过程中如果我们提供的初始值数量少于数组的大小时;
当我们不使用初始值定义一个局部变量时;
当我们通过书写形如T()的表达式显式地请求值初始化时,其中T是类型名,它就是使用一个这种形式的实参来对它的元素初始化器进行值初始化;

18、类声明对象是不需要加括号!加括号是声明函数的。

19、如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,把这种构造函数称作转换构造函数;只允许一步类类型转换;在要求隐式转换的程序上下文中,可以通过将构造函数声明为explicit加以阻止;该关键字只对一个实参的构造函数有效,只能在类内声明构造函数时使用,在类外部定义时不应重复;explicit构造函数只能用于直接初始化;

20、聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式,当一个类满足如下条件时,我们说它是聚合的:
所有成员都是public的;
没有定义任何构造函数;
没有类内初始值;
没有基类,也没有virtual函数;

21、显式地初始化类的对象的成员存在三个明显的缺点:
要求类的所有成员都是pubilic的;
将正确初始化每个对象的每个成员的重任交给了类的用户(而非类的作者)
添加或删除一个成员后,所有的初始化语句都需要更新;

22、数据成员都是字面值类型的聚合类是字面值常量类,如果一个类不是聚合类,但它符合下述要求,则它也是一个字面值常量类:
数据成员都必须是字面值类型;
类必须至少含有一个constexpr构造函数;
如果一个数据成员含有类内初始值,则内置类型成员的初始值必须是一条常量表达式,或者如果成员属于某种类类型,则初始值必须使用成员自己的constexpr构造函数;
类必须使用析构函数的默认定义,该成员负责销毁类的对象;

23、constexpr构造函数体一般来说应该是空的,constexpr构造函数必须初始化所有数据成员,初始值或者使用cosntexpr构造函数,或者是一条常量表达式;

猜你喜欢

转载自blog.csdn.net/qq_38224589/article/details/81773375