C++学习笔记(十三):C++对象模型

C++类的成员、指针及常函数对象解析
本文围绕C++类展开,介绍成员变量和成员函数分开存储,非静态成员变量才属于类对象。阐述this指针隐含在非静态成员函数内,可解决名称冲突等。还提及空指针访问成员函数的限制,以及常函数和常对象的语法、特点与注意事项。

成员变量和成员函数

成员变量和成员函数分开存储
只有非静态的成员变量才时类的对象
静态成员变量、静态成员函数、非静态成员函数在内存中只有一份

空对象所占内存空间为:1字节(主要为了区分不同空对象)

this指针

this 指针隐含在每一个非静态成员函数内的一种指针常量,并且指向被调用的成员函数所属的对象,可直接使用。

作用

  1. 解决名称冲突
class Person{
private:
	int age;
public:
    Person(int age){
        this->age=age;//this->age是类的成员变量,age是函数传进来的形参
    }
 }
  1. 返回对象本身用*this
    Person& addAge(int ans){
        age+=ans;
        return *this;
    }
    .
    .
    .
    Person p1(12);
    //链式编程思想
    p1.addAge(2).addAge(3).addAge(4);

空指针访问成员函数

利用类的空指针访问成员函数,不能访问含有this的成员函数。

class Person{
private:
	int age;
public:
	void test0(){
		cout<<"hello,world"<<endl;
	}
	void test1(){
		cout<<age<<endl;
	}
};
.
.
.
Person* p=NULL;
p->test0();//正确
p->test1();//错误操作,test1()中age相当于this->age,此时this指针为空

为了提高代码的健壮性,将上述类中的test1函数改为:

void test1(){
	if(this==NULL){
		return;
	}
	cout<<age<<endl;
}
.
.
Person *p=NULL;
p->test1();//正确

常函数和常对象

常函数

语法
返回值类型 函数名 (参数列表)const {
函数体
}
特点:

  1. 常函数不可以修改成员属性
  2. 加关键字mutable的成员属性,常函数内可以修改
class Person{
public:
	int age;
	mutable int key;
	void test() const{
	//这里的age相当于this->age,this指针相当于Person *const this;
	//在函数后加const相当于const Person *const this,此时this的指向的值也不能修改
		age=23//错误操作
		key=1;//正确
	}
}

注意问题
在定义类的只读成员函数时,最好定义为常函数

常对象

语法: const 类名 对象名;
特点:
1.常对象只能调用常函数
2.在public权限下,常对象不能更改普通成员变量,加mutable才能修改。

class Person{
public:
	int age;
	mutable int key;
	void test() const{
		key=1;//正确
	}
	void test2(){
	}
}
.
.
.
const Person p1;
p1.age=20;//错误操作
p1.key=2;//正确
p1.test2();//错误操作
p1.test();//正确
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值