一、类中常函数以及常对象问题:
1、常函数内无法修改类对象,如有特殊可修改变量,在变量前加mutable关键字;如:
class Person3 {
public:
Person3(){}
Person3(int age) {
m_age = age;
}
void showage() const{
m_age = 4;//错误
change = 3;//正确
cout << m_age << endl;
}
int m_age;
mutable int change;
};
2.常对象
2.1常对象中对象不可修改,除非添加mutable关键字如
class Person3 {
public:
Person3(){}
Person3(int age) {
m_age = age;
}
void showage() const{
cout << m_age << endl;
}
int m_age;
mutable int change;
};
int main(void) {
const Person3 p1(10);
p1.m_age = 20;//错误
p1.change=5;//正确
p1.showage();
return 0;
}
2.2常对象只能调用常函数,如:
class Person3 {
public:
Person3(){}
Person3(int age) {
m_age = age;
}
void showage() const{
cout << m_age << endl;
}
void func() {
cout << "调用func函数" << endl;
}
int m_age;
mutable int change;
};
int main(void) {
p1.showage();//正确
p1.func();//错误
return 0;
}
二、友元函数
友元函数可访问设置友元函数的类,但该类无法访问到友元函数内的私有内容
注意点:1、友元函数使用前一定要先声明,包括类,全局函数,都要先定义才能使用友元函数。
三、类的静态成员变量,成员函数
1>成员变量
特点:1、所用对象共享一份数据
2、编译阶段分配内存
3、类内声明,类外初始化
4、可以直接使用类名直接访问
2>成员函数
1、静态成员函数只能访问静态成员变量
原因:普通成员函数调用时会产生this指针指向调用函数的对象,而静态成员函数不会调用this指针,因此无法区分非静态变量。
2、可以用类名调用
使用情景:单例函数
(1)。将构造函数私有化,无法创建多个变量,且无法调用拷贝构造函数
(2)。初始化类内静态变量
设置访问接口
(3)。使用类名访问静态变量赋值。
3、类中函数调用同类型变量时,可以访问私有变量
四、类对象的大小
1、空对象有一个字节的大小,是每个对象在内存上有独一无二的地址
2、成员函数和成员变量分开存储,不占用类空间
3、静态成员变量不占用类空间
总之,只有非静态成员变量才占用类对象内存空间,占用空间满足内存对齐