c++_class

class vs struct

唯一的区别,就是默认访问权限不同。 class 的默认访问权限是privatestruct 的默认访问权限是 public

拷贝构造函数

调用时机:

  1. 当把一个已经存在的对象赋值给另一个新对象时,会调用拷贝构造函数。

  2. 当实参和形参都是对象,进行实参与形参的结合时,会调用拷贝构造函数。

    1
    2
    3
    4
    5
    6
    void f(A p);

    void main(){
    A a;
    f(a);//a实参去初始化形参p,会调用copy构造函数
    }
  3. 当函数的返回值是对象,函数调用完成返回时,会调用拷贝构造函数。

赋值运算函数

默认情况下依然会采用浅拷贝的方式拷贝字符串。当两个对象被销毁时,同样会造成double free的问题,因此缺省赋值运算符函数不再满足需求,此时需要显式定义赋值运算符函数.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* double free
Computer & Computer::operator=(const Computer & rhs){
_brand = rhs._brand;
_price = rhs._price;
return *this;
}
*/
Computer & Computer::operator=(const Computer & rhs){
if(this != &rhs) {
delete [] _brand;
_brand = new char[strlen(rhs._brand) + 1]();
strcpy(_brand, rhs._brand);
_price = rhs._price;
}
return *this;
}

静态数据成员

静态数据成员和静态变量一样,当程序执行时,该成员已经存在,一直到程序结束,任 何该类对象都可对其进行访问,静态数据成员存储在全局/静态区,并不占据对象的存储空间。
静态数据成员不属于类的任何一个对象,所以不能在类内部初始化静态数据成员,必须在类的外部定义和初始化静态数据成员。

静态成员函数

静态成员函数的参数列表中不含有隐含的this指针,静态成员函数内部不能使用非静态的成员变量和非静态的成员函数,只能调用静态数据成员和静态的成员函数。

const成员函数

  1. 只能读取类数据成员,而不能修改之。
  2. 只能调用const成员函数,不能调用非const成员函数。