1.类构造函数的参数名不能与类成员名相同;构造函数没有返回值和类型;
2. 显示调用构造函数、隐式调用构造函数:
Stock food=Stock(....);//显式 Stock food(....);//隐式 Stock *pstock=new Stock(....);//对象指针
3. 无法使用对象来调用构造函数;
4.默认构造函数的注意点:
①隐式调用构造函数:
Stock stock;//注意不要写成stock(),这要会变成一个返回对象的函数!
如果没有提供任何默认构造,则c++自动提供默认构造函数的隐式版本,不会做任何构造工作:
Stock::Stock(){}
②定义默认构造函数的方法:
<1> 提供默认值; <2>函数重载;p354.
③一定注意不要写成声明函数:
Stock second();//错误的类构造初始化,其实是声明返回Stock对象的函数!
5 析构函数
①析构函数负责对new的内存进行delete,如果没有使用new,则析构函数没有需要完成的任务!这种情况下只需让编译器生成一个隐式析构函数即可。
②析构函数没有参数;
③p359 10.6 对临时对象的理解!
6. const 成员函数:只要类方法不修改调用对象,则应声明为const:
void show() const;//声明
void Stock:: show() const;//定义
注意,在此处的const,其实是对this指针的const,也就是调用对象的const!!p365
7.类作用域
①作用域为类的常量:
类声明中不能包含类似于const int var=12的表达式,因为声明只是描述了对象,并没有创建对象,也就没有存储变量的空间;p371
解决这种问题可以用<1>枚举做符号替换;<2>在类声明中使用static const int Months=12;
②作用域内枚举,解决两个枚举中枚举变量名相同的冲突问题;p372
enum class egg {Small,Medium,Large}; enum class tshirt {Small,Medium,Large};
//解决conflict问题 egg choice=egg::Large tshirt floyd=tshirt::Large
8. 友元函数解决重载运算符的2.5*B的问题,即对象在后无法使用重载运算符成员函数的问题;p392
友元函数与重载运算符相辅相成!
9 类的自动转换和类的强制类型转换 p419
①类的自动转换是指:把一个数值赋值给一个只有一个参数(或者有其他默认参数)的构造函数的类。在构造函数声明中使用explicit可防止隐式转换。
② 类的强制类型转换是指:利用重载运算符函数(operator int等),把一个类赋值给对应类型的数值型变量;关于转换函数的注意事项,参看p416
③关于类的自动转换与重载+,- 等运算符共存时的注意事项:当double位于二元运算符左侧时,类成员函数版本的+重载是不能自动转换为类对象的,解决方法参看p421
10 类的静态成员与静态成员函数
①静态成员:p426 ,所有对象共享一个静态成员。关于如何初始化静态成员变量,参看p428 and 菜鸟教程
11 类中的拷贝构造函数 p433
①何时调用:新建一个对象并将其初始化为同类现有对象时;具体的说,当函数按值传递对象或者函数返回对象(p449 12.4.1)时,都会使用复制构造函数。
因为按值传递对象将会调用复制构造函数,因此应该按引用传递对象,这样可以节省调用复制构造函数的时间以及存储新对象的空间。
StringBad ditto(motto); StringBad metoo=motto; StringBad also=StringBad(motto); StringBad *pStringBad=new StringBad(motto);
②默认的复制构造函数的功能:
<1>会逐个复制非静态成员(成员复制被称为浅复制);
<2>如果成员本身是类对象,则会调用这个类的复制构造函数;
<3> 静态成员不受影响,因为其属于整个类;
③ 浅拷贝与深拷贝的区别
<1>浅拷贝:在复制构造函数中拷贝的是成员的值,如果是指针的话,则是同一地址,这样在析构时会导致一个内存空间被释放两次,产生不可预知的错误;
<2>深拷贝:在复制构造函数中,对于指针变量,对应new出来存储空间以存储对应的变量的值。p435
<3> 深拷贝的实现:可以通过拷贝构造函数;也可以通过重载运算符=;两者有一些差别,具体实现参看p437;
具体来说,拷贝构造函数用于上列4种情况时发挥作用:
StringBad ditto(motto); StringBad metoo=motto; StringBad also=StringBad(motto); StringBad *pStringBad=new StringBad(motto);
而重载operator=是用于下列情况,即先通过默认构造函数初始化类,然后再赋值已存在的对象时:
String name; char temp[40]; cin.getline(temp,40); name=temp;
12. new,delete对象时,将调用对象的构造函数(或者拷贝构造函数),析构函数。p454。new会返回开辟的地址
13. 对象的定位new运算符:
①一般new对象时,会返回对象占用内存的地址给指针,这样配合使用delete可以释放对应的内存;
②而使用new(buffer)时,不会返回地址,而地址就是buffer指针指向的地址,这时要用delete [],注意带[]。而且定位new运算符不会调用对象的析构函数。p457
③对于new定位运算符,需要显式调用析构函数来释放对象!p459