C++类中需要注意的地方

来源:互联网 发布:汇丰杯sas数据分析大赛 编辑:程序博客网 时间:2024/05/15 03:37

Talk is cheap, show me the code.

  1. 类的静态成员函数不允许声明为const,否则编译会报错。当类的非静态成员函数被声明为const, 表明这个非静态成员函数隐含传入的this指针为const指针,即指针指向的对象为常量, 在函数内部不允许对类的成员变量进行赋值,否则会报错,并且在类外部实现该非静态成员函数时也需要加上const声明,否则编译也会报错。

  2. 类class不加修饰符时默认是private的,结构体struct不加修饰符默认是public的。

  3. 关于const和非const变量或对象之间是否能直接赋值的问题。const和非const变量之间时可以直接相互赋值的,因为赋值只是将变量值进行一次拷贝,但是如果是指针变量的话就需要注意: 不能将const char*变量赋值给char*,虽然赋值的只是对象地址,但是可能会导致指针指向的对象值的改变;可以将char* const 变量赋值给char*,因为char* const是指向变量的常量指针,赋值只是将指针地址进行拷贝,作用等同于将const int 赋值给int。

  4. std中定义的pair的使用方法:pair是定义在标准库中的一个结构体,有两个成员变量first和second,是对两种类型的一个简单封装,构建pair的方式有两种,一种是直接使用构造函数:

    pair<string, int> p1("lee", 2);

    另一种是采用标准库中定义的函数make_pair:

    pair<string, int> p2 = make_pair("www", 3);

  5. 构造函数不可以声明为const;构造函数可以使用初始化列表进行成员变量初始化: Constructor():member1(val1), member2(val2){};初始化列表中变量初始化的顺序只和类成员变量定义的次序有关,和初始化列表中出现的次序无关。

  6. 对于没有构造函数的类类型成员,const成员或引用类型成员, 必须在构造函数的初始化列表中进行初始化,在构造函数体内进行赋值初始化是无效的。

  7. int i = 1; const int i1 = i; int &i2 = i; 这些都是正确的,但是为什么在构造函数中不能通过在函数体内赋值进行初始化,而必须在初始化列表中初始化呢?这是因为构造函数执行时分两个阶段,一个阶段是进行初始化阶段,初始化列表就是在初始化阶段执行的;另一个阶段是普通的计算阶段,当进入构造函数体内时其实初始化阶段已经结束,进入了普通计算阶段。如果只是通过在函数体内对const或引用类型成员赋值,这些成员其实在初始化阶段已经被默认初始化成了不确定的值,这里再进行赋值就会出错,编译不通过。

  8. explicit关键字只用于类的内部用来修饰构造函数的声明,构造函数如果再类外部定义无需加上explicit关键词,否则会报错。explicit关键字的作用是不允许隐式转换。

  9. 对于非浮点型数据类型可以直接类内部初始化静态常量,但是浮点型就不能直接在类内部初始化静态常量。静态变量都不可以在类内部进行初始化。

    class Test1
    {
    public:
    static int a = 1; //error
    static const int b = 1; //right
    static const double c = 1.2; //error
    };
    int Test1::a = 1; //right
    int Test1::c = 1.2; //right

  10. 一般来说,最好显示或隐式定义默认构造函数和复制构造函数。只有不存在其他构造函数时才合成默认构造函数。如果定义了复制构造函数,也必须定义默认构造函数。没有复制构造函数将会严重限制类的使用,对象只能采用引用的方式作为函数参数或者返回类型,并且不能作为容器的元素。 对于带有指针类型的类尤其需要注意,需要自己定义复制构造函数,因为编译器自动合成的复制构造函数将会是赋值指针,而不是赋值指针指向的对象。复制构造函数的形参通产都是const引用类型的,引用类型是必须的,const不一定是必须,但是最好带上。

  11. 通常需要自己定义析构函数,那么也需要自己定义复制构造函数和重载赋值操作符,这被称为复制控制三原则。编译器自动合成的析构函数不会自动释放指针资源,必须自己手动删除。析构函数中撤销数组资源时会逐个撤销数组中每个元素资源,并且是按照从后往前逆序撤销。

  12. 类中涉及到动态分配资源或者涉及到指针,一般都是需要自己定义复制控制函数(复制构造函数,重载赋值操作符,析构函数)的,因为动态分配的资源析构函数不会自动回收,包含指针时默认合成的复制构造函数和赋值操作符都是只复制指针值,而没有复制指针指向的对象,这样容易出现垂悬指针。

1 0
原创粉丝点击