1.初始化列表
实现构造函数时,除了在函数体内赋值之外,还有一种初始化的方法,即初始化列表,以一个冒号开始,逗号分隔,中间为“成员变量(初始值)”,初始化列表是每个成员变量初始化的地方,每个成员都要走初始化列表,每个成员变量在初始化列表中只能出现一次,引用成员变量,const成员变量,无默认构造的类类型变量,都必须放在初始化列表中显示初始化
struct Data
{
//初始化列表
Data(int a=10,int b=10)
:_a(a),
_b(b)
{
}
int _a;
int _b;
};
初始化列表按照成员变量在类中的声明顺序进行初始化,和成员在初始化列表中出现的顺序无关,比如下面这段代码:
struct Data
{
//初始化列表
Data()
:_b(10),
_a(_b)
{
}
int _a;
int _b;
};
int main()
{
Data d;
cout << d._a <<endl;
cout << d._b << endl;
return 0;
}
打印出的将会是一串随机数和10,因为按照初始化顺序,在_a初始化时_b还没有初始化
2.static成员
由static修饰的成员变量,称为静态成员变量,只能在类外进行初始化,为所有对象共享,不存在于对象中,仅存放于静态区,由static修饰的成员函数,称为静态成员函数,无this指针,因此只能访问其他静态成员和静态函数,不可以访问非静态的,通过类名::静态成员,对象.静态成员来访问静态成员变量和静态成员函数
struct Data
{
//初始化列表
Data()
:_b(10),
_a(_b)
{
}
int _a;
int _b;
//静态成员变量
static int num;
static void sayHello()
{
cout << "Hello World!" << endl;
}
};
//只能在类外部初始化
int Data::num = 10;
int main()
{
Data d;
//调用静态成员
cout << Data::num << endl;
cout << d.num << endl;
Data::sayHello();
d.sayHello();
return 0;
}
3.友元声明
添加friend在函数声明和类声明前,并放在类中以创建这个类的友元类和友元函数,友元类和友元函数可以访问该类中的说有变量和函数,不受访问修饰符限制友元类具有单向不可传递的关系,即a是b的友元,但b不一定是a的友元
struct Data
{
//进行友元声明
friend int GetC(Data d);
//初始化列表
Data()
:_b(10),
_a(10)
{
}
int _a;
int _b;
private:
int _c = 10;
int _d = 10;
};
int GetC(Data d)
{
//通过友元声明获取了_c
return d._c;
}
3.内部类
将一个类定义在另一个类的内部,这个类称之为内部类,内部类仍是一个独立的类,仅受外部类类域和访问修饰符影响,在外部类的对象中是不存在这个类的,内部类默认为外部类的友元类
struct Data
{
int _b;
//定义内部类
struct InnerData
{
int _a = 0;
void say(Data d)
{
//内部类默认为外部类的友元类
cout << d._c << endl;
}
};
private:
int _c;
};
int main()
{
//创建内部类
Data::InnerData d;
return 0;
}