初始化列表
作用:
C++提供了初始化列表的语法,用来初始化属性
语法:构造函数():属性1(值1),属性2(值2)...{}
#include <iostream>
using namespace std;
class Person
{
public:
//传统的初始化操作
//Person(int a,int b,int c)
//{
// my_A = a;
// my_B = b;
// my_C = c;
//}
//初始化列表初始化属性
Person(int a, int b, int c) :my_A(a), my_B(b), my_C(c) {}
int my_A;
int my_B;
int my_C;
~Person() //析构函数
{
cout << "析构函数的调用" << endl;
}
};
void test01()
{
Person p(10,20,30);
cout << "p.my_A=" <<p.my_A<< endl;
cout << "p.my_B=" << p.my_B<<endl;
cout << "p.my_C=" << p.my_C<<endl;
}
int main()
{
test01();
return 0;
}
类对象作为类的成员
C++类中的成员可以是另一个类的对象,我们称该成员为对象成员
class A()
class B
{
A a;
}
那么当创建B对象时,A与B的构造和析构顺序是谁先谁后?
当其他类对象作为本类成员,构造时候先构造类对象再构造自身,析构的顺序与构造相反
#include <iostream>
#include <string>
using namespace std;
class Phone {
public:
Phone(string pName)
{
m_PName = pName;
cout << "Phone构造函数的调用" << endl;
}
string m_PName;
~Phone() //析构函数
{
cout << "Phone析构函数的调用" << endl;
}
};
class Person
{
public:
//姓名
string m_Name;
//手机
Phone m_Phone;
Person(string name, string pName) :m_Name(name),m_Phone(pName){
cout << "Person构造函数的调用" << endl;
}//Phone m_Phone=pName(隐式转换法)
~Person() //析构函数
{
cout << "Person析构函数的调用" << endl;
}
};
void test01()
{
Person p("张三","苹果MAX");
cout << p.m_Name << " take " << p.m_Phone.m_PName << endl;
}
int main()
{
test01();
return 0;
}
输出结果:
静态成员
静态成员:在成员变量和成员函数前加上关键字static
静态成员分为:
- 静态成员变量
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员函数(两种访问方式)
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量
class Person
{
public:
static void func()
{
cout<<"static void func()的调用"<<endl;
}
//静态成员函数也有访问权限
private:
static void func2()
{
cout<<"static void func2()的调用"<<endl;
}
};
void test01()
{
//通过对象访问
Person p;
p.func();
//通过类名访问
Person::func();
}
成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储,只有非静态变量才属于类的对象上
当只创建一个空的类:
空对象占用的内存空间为:1
C++编译器会给每个对象也分配一个字节空间,是为了区分空对象占内存的位置
因此每个空对象也应该有一个独一无二的内存地址
当加入一个非静态成员变量后:
再加入一个静态成员变量后:
依然为4:
同样的对于成员函数,无论静态还是非静态都不属于类的对象上。