c++类与对象注意点

1. 类数据成员定义时不能初始化,比如:

class a

{

    int i;

    int j = 1; //错误,不能初始化值

}

 

2. 类的构造函数对自身数据成员包括初始化和赋值,初始化是:i(1),j(1),赋值是在构造函数体内的显示给值,对有类型数据来说二者效果一样,而有些类型数据只能做初始化而不允许赋值。例如:

class a

{

    private:

        int i;

        int j;

        const int k;

    public:

        a(int d):i(1),j(2),k(3)

        {

               // 函数体叫赋值操作而不是初始化,本例中K在这里不再允许赋值

        }

}

 

3. 类和函数一样,可以先声明再定义,未定义之前声明的类叫不完全类型,这种声明叫向前声明。它的含义是表示有这么一个类,但成员及成员类型未知,例如:

class a; // 声明了一个叫a的不完全类型

 

4. 类定义以封号结束,可以在定义类的代码后直接定义类对象并以封号结束例如:

class a

{

    //somthing

} cla,clb;

表示定义了两个变量名分别为cla,clb的类型为类a的对象;

 

5. 非静态类中有个叫 this 的指针指向当前类本身,该指针是 *const 的,意味着不能改变这个指针的指向。

    在类的有返回方法中,如果原形为: const &a funt(){ return *this; } 意味着既不能改变返回的this的指向,也不能改变返回this所指向的成员的数据。

 

6. 针对以上出现的问题,可以对返回的this指针对象方法做 const 重载,如:

class a

{

    const &a funt() const   { return *this; }; // 这个版本方法的返回类不能修改成员数据

    &a funt() const {return *this; }; // 这个版本方法的返回类可以修改成员数据

}

在程序中调用方法时如果返回的类没有修改操作系统会调用const版本,否则调用非const版本

 

7. 类一般要定义一个默认构造函数,如果没有默认构造函数有时候会出问题,例如假设类B无默认构造函数(无参的构造函数),在类A的构造函数中又没有显示初始化这时就会处错.

class A

{

    B p;

    A(){}; //如果定义A对象就会出错,因为类B没有无参的构造函数

}

8. 类通过构造函数一般会做类类型转换,例如类A有接收一个INT类型参数的构造函数则:

A list[] = {1,2,3}  等价于 A list[] = {A(1),A(2),A(3)}

也就是可以通过只提供构造函数的参数来转换为具体类对象(只有一个参数的构造函数才能做转换,多个参数的构造函数无法做转换)

可以通过在构造函数前增加关键字 explicit 来阻止这类转换。

 

 9. 类可以有静态成员,类的静态数据成员只能在定义体外定义,且定义时需要同时给予初始化。因为静态数据成员不能在构造函数中初始化,c++类也不提供静态构造函数。示例代码如下:

class A{}

int A::sti = 2; // 表示对类A的静态int型数据成员sti定义且初始化为2. 

有一种情况例外,类的静态常量数据成员不可以在定义体外定义和初始化,而必须要要在类定义体内定义及初始化。 class a{ private: static const stj = 2; }

 

10. 不同于C#对静态成员只能通过类名称来使用,c++静态成员不但可以通过类名称来使用,也可以通过具体对象来使用。

 

11. 有一种特殊情况,对于整值或枚举型的static   const变量,可以直接在类内声明定义。如:
class   A
{
public:
    static   const   int   i   =   3;
    int   p[i];
};
这个i就在类内定义给值了,因为下面p变量需要它,但即使这样也需要在类外把它重新定义一下:
const   int   A::i;
定义的时候,不要再把初始化的值写上。

posted on 2012-01-12 15:47  老金  阅读(674)  评论(0编辑  收藏  举报