1.编译器为class A{}生成的函数
1 class A 2 { 3 public: 4 A(); //缺省构造函数 5 A(const A&rhs); //拷贝构造函数 6 ~A(); //析构函数 7 A& operator=(const A&rhs); //赋值运算符 8 A* operator&(); //取址运算符 9 const A* operator&() const; //取址运算符(const版本) 10 };
2.------ --------- --------- ------- ---- ---
const放在函数前分为两种情况,
一返回指针,此时该对象只能立即复制给新建的const char*,而不能是char*,意在强调值被保存在常指针中,
二返回一个char也就是值,此时const无意义,应当避免。
const放在函数后表明,该成员函数不得修改本对象任何成员,如果有对成员赋值语句则报错,相当于一种接口规范。
3.-------- ----------- -------- ----------
4. ------ --------- --------- ------- ---- ---
C++静态成员函数访问非静态成员的几种方法 - Ricky.K - 博客园 (cnblogs.com)
总结评论:
提供了突破的思路,与友元相仿,
然而破坏了面向对象三原则之一:封装。如果是改造一个旧的系统,这样做可以理解,但如果是设计一个新的系统,还是应该在设计上提高能力。
另外方法三是非线程安全的。
非静态方法调用静态函数:通过实例化对象调用
5. ------ --------- --------- ------- ---- ---
如果虚基类只存在有参构造函数且参数未提供默认值,则需要注意以下几点:
1) 对于虚基类的任何一个直接或间接派生类的构造函数,它的初始化列表中都必须包含对该虚基类构造函数的直接调用,以初始化虚基类中的数据成员。
2) 只在最后一层派生类的构造函数中调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用均被忽略。
3) 最后一层派生类的构造函数的调用顺序为:先调用虚基类的构造函数,再按照一般的多重继承中对基类构造函数的调用顺序依次调用各非虚基类的构造函数,最后调用本类的构造函数。
6. ------ --------- --------- ------- ---- ---
7. ------ --------- --------- ------- ---- ---
内联函数
1.内联函数的函数体内不能含有复杂的结构控制语句,如switch和while,否则编译器将该函数视同普通函数那样产生函数调用代码。
2.递归函数不能被用来作为内联函数。
3.内联函数一般适合于只有1-5行语句的小函数,对于一个含有很多语句的大函数,没必要使用内联函数来实现。
4.内联函数的定义必须出现在内联函数第一次被调用之前。
5.对内联函数不能进行异常接口声明,就是不能声明可能抛出的异常
1
2
3
4
|
class a { inline virtual void test(){} }; |
搞清本质。
9.关于const函数的一些内容:c++的const函数特点:1. 不能在const函数中修改所在类的对象的数据,因为const函数中的*this是常量,同样只能访问const函数;
2. const函数中只能调用其他的const函数,不能调用非const函数,因为对象调用函数是需要传递对象自己,const函数中的*this是常量,非const函数中的*this是变量,因此不可以调用(除非去除*this的const属性);
Note:使用const_cast后,可以在const函数中调用非const函数的
3. const函数与同名的非const函数是重载函数;
4. const对象只能调用const函数 ,但是非const对象可以调用const函数。
初始化为NULL的类指针,可以安全的调用不涉及类成员变量的类成员函数而不会出错。
这道题中的say成员函数不是virtual的,C++处于效率上的考虑,对指针v直接进行静态绑定,say中不涉及对成员变量的操作,因此空指针的调用是没问题的
11. ------ --------- --------- ------- ---- ---