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;
定义的时候,不要再把初始化的值写上。