一、struct 和 class 用法一样,结构体成员变量默认为公有,类默认为私有
二、栈,堆和全局数据区都可创建对象,栈中成员变量的初始值为随机值,无论在哪创建对象都会调用构造函数
三、类的定义和声明是不同的
四、自动匹配调用构造函数,初始化要调用构造函数
五、定义(赋值)和初始化不同
六、编译器为我们提供默认的无参构造函数和拷贝构造函数的条件
七、初始化列表的使用,初始化的顺序跟成员的声明顺序相关,成员变量只能通过初始列表进行初始化
八、const成员变量本质是只读变量,只能通过初始化列表赋值,可以通过指针改变值
九、goto关键字改变程序的执行流
十、全局对象的构造顺序是不确定的
十一、free函数只是一个普通的函数,必须显示的调用
十二、析构函数不能被重载
十三、临时对象的生命周期只有一条语句的时间
十四、编译器会进行优化,尽量避免临时对象的产生
十五、析构函数的调用顺序,类似于出栈入栈
十六、const也能修饰对象和成员函数,const只读对象只能调用const成员函数
十七、函数只能位于代码段,所以所有对象共享一套成员函数,成员函数有个特殊的this指针参数,用于指向当前对象,成员函数可以访问任意类对象的成员变量
十八、静态成员变量,需要在类外单独分配空间,位于全局数据区,需要在类外使用类名分辨符进行定义和初始化
十九、静态成员函数不隐含this指针
二十、构造函数不能保证初始化逻辑完成,半成品对象
二十一、友员直接破坏了面向对象的封装性
二十二、函数重载发生在同一个作用域中,全局函数和成员函数不能构成重载
二十三、操作符的重载,优先在成员函数匹配,全局函数和成员函数都可以实现操作符的重载,返回对象的引用(会生成临时对象)
二十四、函数参数的默认值在函数定义的时候指定就行
二十四、赋值操作符只能通过成员函数实现
二十五、字符串和数字的转换,宏:#define TO_NUMBER(s,n) (istringsteam(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream()<<n)).str())
二十六、函数对象,重载()符号,重载函数调用操作符,用于取代函数指针
二十七、编译器默认为每个类重载了赋值操作符,只是进行浅拷贝
二十八、编译器默认提供:构造函数,析构函数,拷贝构造函数,赋值操作函数
二十九、智能指针的实现重载 * 和 -> 操作符,智能指针智能指向堆空间中的对象或者变量
三十、函数参数的计算顺序是不定的,所以重载逻辑操作符有陷阱
三十一、逗号表达式是最后一个表达式的值,重载逗号操作符必须有一个类类型参数,返回的是引用,工程中不要重载逗号操作符
三十二、类类型的前置后置++,前置比后置效率更高
三十三、转换构造函数:有且仅有一个参数,参数是基本类型,参数是其他类类型
三十四、exlicit 避免隐式的强制类型转换,转换构造函数 static_cast, 自定义类型转换函数,类型转换函数可能与转换构造函数冲突,Type toType()代替类型转换函数
三十五、组合关系,之类是一个特殊的父类,之类对象可以直接初始化父类对象,子类对象可以直接赋值给父类对象,默认为私有继承方式,C++的派生语言只支持公有继承
三十六、显示和隐式调用父类的构造函数,显示通过初始化列表调用,默认适用无参构造函数和适用默认参数的构造函数,都没有匹配上则报错,先父母,后客人,再自己,析构相反
三十七、父子间的同名覆盖,可以通过作用分辨符和父类名访问;同名函数的覆盖,不能重载(不在同一个作用域中),作用域分辨符解决
三十八、父子兼容:子类对象可以直接赋值给父类对象,子类对象可以直接初始化父类对象,父类指针可以直接指向子类对象,父类引用可以直接引用子类对象,子类退化为父类后只能访问父类的成员和函数,不存在同名覆盖了,特殊的同名函数(函数重写),编译期间,编译器只能根据指针的类型判断所指的对象
三十九、virtual 对多态进行支持,具有多态性,可以继承,只写一遍virtual ,函数重写必须实现多态,静态联编(函数重载),动态联编(函数重写)
四十、reinterpret_cast<B*>(&a):重新解释一段内存空间,运行时对象退化为结构体形式,访问权限在运行时失效,C++成员函数调用时隐藏传递了对象指针,成员变量和函数是分开存放的
四十一、C++继承的对象模型,虚函数表,存在虚函数时,每个对象都有一个指向虚函数表的指针,因此虚函数会牺牲一定的效率,虚函数表指针放在最开始的四个字节处,继承成员变量的叠加
四十二、抽象类只能被继承,C++没有抽象类,通过特殊的虚函数(纯虚函数),抽象类不能定义对象,但是可以定义指针
四十三、接口:没有定义任何成员变量,所有函数都是公有的,所有成员函数都是纯虚函数。C++中是一种特殊的抽象类
四十四、C++支持多重继承,多重继承可能拥有不同的地址,但指向的是同一个对象;多重继承可能产生冗余的成员,虚继承可以解决数据冗余,但中间层父类不在关心顶层父类的初始化,最终子类必须直接调用顶层父类的构造函数,一般在工程中不使用多重继承
四十五、多重继承可能产生多个虚函数表,新型的强制类型转换方式:dynamic_cast<BaseB*>(pa) 进行指针的修正,使用时要求类中必须有虚函数,指针转换失败返回空指针,引用转换失败则发生操作异常;单继承加实现多接口的开发方式
四十六、构造函数不可能成为虚函数,在构造函数执行结束后,虚函数表指针才会被正确的初始化,析构函数可以成为虚函数,建议设计成虚函数(因为可能跳过子类的析构函数)
四十七、构造函数和析构函数中不能发生多态行为(调用其他函数),只调用当前类中定义的函数版本
四十八、函数模板的使用:自动推导,显示调用
四十九、函数分:成员函数,静态函数,构造函数,析构函数
五十、构造函数不属于成员函数
五十一、const成员变量只能调用const成员函数