C++ 相关积累

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(){}
};
尽管以上写法是没有语法错误的,并且可以执行,但其实test函数已经不是内联函数了,因为inline只是对编译器的一个建议而已。
搞清本质。
//默认地,类中定义的所有函数,除了虚函数之外,会隐式地或自动地当成内联函数(注意:内联只是对于编译器的一个请求,编译器可以自己决定是否进行内联).
//无论何时,使用基类指针或引用来调用虚函数,它都不能为内联函数(因为调用发生在运行时)。但是,无论何时,使用类的对象(不是指针或引用)来调用时,可以当做是内联,因为编译器在编译时确切知道对象是哪个类的
 
 
8 ------    ---------   ---------     -------    ----   ---
指出下面程序哪里可能有问题?
 
      (1) 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;
      (3) 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;
      (4) 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃。
 
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函数。

 
 
10 ------    ---------   ---------     -------    ----   ---

 初始化为NULL的类指针,可以安全的调用不涉及类成员变量的类成员函数而不会出错。

 这道题中的say成员函数不是virtual的,C++处于效率上的考虑,对指针v直接进行静态绑定,say中不涉及对成员变量的操作,因此空指针的调用是没问题的

11.  ------    ---------   ---------     -------    ----   ---

天涯犹在,不诉薄凉。
原文地址:https://www.cnblogs.com/Knight02/p/14829570.html