C++面向对象—封装(2)
Date:2021.9.30
Author:lqy
一、初始化列表:
-
初始化列表简介: C++面向对象编程提供初始化列表完成类似于有参构造函数的功能 -
代码示例: class Person
{
public:
int a;
int b;
int c;
public:
Person(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
Person() :a(10), b(10), c(10)
{}
Person(int aa, int bb, int cc) :a(aa), b(bb), c(cc)
{}
};
二、类对象作为类成员:
-
类对象作为类成员简介:
-
构造函数->先创建内部成员,进而创建外部对象 -
析构函数->先析构外部对象,进而析构内部成员 -
代码解析: class Phone
{
public:
string brand;
public:
Phone() {}
Phone(string name)
{
this->brand = name;
}
};
class Person
{
public:
string name;
Phone p;
public:
Person(string name, string pName)
{
this->name = name;
this->p.brand = pName;
}
Person(string Personname, string pName) :name(Personname), p(pName)
{}
};
三、静态成员变量static
-
静态成员变量简介:
- 静态成员变量特点:
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外进行初始化
- 静态成员变量的访问形式:
-
代码声明: class Person
{
public:
static int a;
private:
static int b;
};
int Person::a = 100;
int Person::b = 600;
void test01()
{
Person p;
Person p2;
cout << p.a << endl;
p2.a = 200;
cout << p.a << endl;
}
void test02()
{
Person p;
cout << p.a << endl;
cout << Person::a << endl;
}
四、静态成员方法
-
静态成员方法简介:
- 与静态成员变量类似,所有对象共享同一个静态函数
- 静态成员函数仅能访问静态成员变量
-
代码示例: class Person
{
public:
static void func()
{
cout << "函数调用" << endl;
a = 100;
}
static int a;
int b;
};
int Person::a = 0;
void test01()
{
Person p;
p.func();
Person::func();
}
五、成员变量和成员函数分开存储
-
内部存储简介:
- 只有非静态成员变量属于类的实例化对象上
- 静态成员变量本质上仅有一份,不属于任何特定对象,当然也不占用本对象内存
- 静态成员函数和非静态成员函数均不占用本对象内部空间,不属于特定的对象
-
代码示例: class Person
{
int a;
static int b;
void func(){}
static void func(){}
};
void test01()
{
Person p;
cout << sizeof(p) << endl;
}
void test02()
{
Person p;
cout << sizeof(p) << endl;
}
六、面向对象之This指针
-
this指针简介:
- this指针指向被调用函数所属的对象
- this指针隐含在每一个非静态成员函数的内部,不需要定义,直接使用即可
-
this指针应用场景:
-
代码示例: class Person
{
public:
int age;
Person(int age)
{
this->age = age;
}
Person& PersonAddage(Person& p)
{
this->age += p.age;
return *this;
}
};
void test01()
{
Person p(10);
Person p2(10);
p2.PersonAddage(p).PersonAddage(p).PersonAddage(p);
cout << p2.age << endl;
}
Tips: PersonAddage函数的返回值方式会影响 p2.PersonAddage(p).PersonAddage(p).PersonAddage(p);
代码的输出:
- 假设以引用的方式返回,每次返回对象引用,即可以完成本对象的年龄age叠加
- 假设以值的方式返回,每次会多次调用拷贝构造函数,创建诸多副本,无法完成原始对象年龄的多次叠加
七、空指针访问成员函数
-
内容简介: 创建Person对象指向空指针NULL,则内置的this指针指向为空,因此程序运行过程中代码会崩溃,为提高程序健壮性,可以设置检测代码,避免程序崩溃。 -
代码示例: class Person
{
public:
void showclassName()
{
cout << "this is Person class" << endl;
}
void showPersonage()
{
if (this == NULL)
{
return;
}
cout << age << endl;
}
public:
int age;
};
void test01()
{
Person* p = NULL;
p->showclassName();
p->showPersonage();
}
八、面向对象class的const修饰符
-
const修饰简介:
- const修饰成员函数,为常函数,常函数内不能修改成员属性,如果想在常函数内修改成员属性,需要添加mutable修饰符
- const修饰class对象,常对象仅能调用常函数
-
代码示例: class Person
{
public:
void showPerson() const
{
b = 100;
}
void func(){}
public:
int a;
mutable int b;
};
void test01()
{
const Person p{};
p.b = 100;
p.showPerson();
}
|