类
创建对象
class A{
public:
int x;
A();
A(int);
};
//1
A a1; // 使用无参构造
//2 有参构造创建对象
A a2(10); // 第一种方式
A a3 = A(20); // 第二种方式
// 第二种方式,编译器可能有两种方式执行
// 与第一种相同,直接使用参数创建对象
// 或者先使用参数创建一个临时对象,然后将临时对象复制到变量a3中,然后丢弃临时对象
// 对已经创建的对象,调用构造函数再次赋值,则首先创建一个临时对象,然后覆盖已有对象
a3 = A(40); // 先使用40创建一个临时对象,然后将其内容复制给a3,随后销毁临时对象。
作用域为类的常量
class T{
public:
const int x = 10;
int arr[x];
};
因为类的声明只是描述了对象的形式,并没有创建对象。所以对象创建前并没有存储值的空间,直接使用const并初始化一个常量量,并没有创建该常量。
使用枚举
class A{
public:
enum {length=10}; // 使用枚举创建符号常量,并没有创建数据类成员
int arr[length]; // 当使用length时,编译器会用10来代替length
};
作用域内枚举
当两个枚举在同一作用域内且永远同名符号时,会发生冲突
enum A{height, width};
enum B{height, width}; // 两个枚举位于同一个作用域时会发生冲突
// C++ 11 ,作用域内枚举,添加class 或者struct关键字
enum class A{height, width};
enum struct B{height, width};
// 创建枚举量时需要枚举名限定
enum class a{h,w};
enum struct b{h,w};
a h = a::h;
b w = b::w;
cout<<int(h)<<endl; // 作用域枚举不会隐式的转换为整性,常规枚举可以
cout<<int(w)<<endl;