c++-类和对象-this指针和const

1.成员变量和成员函数分开存储

在c++中,类内的成员变量和成员函数是分开存储的,只有非静态成员变量才属于类的对象上

如何理解,从下面类成员变量和成员函数在类对象内如何存储可以得知

  • 当类内为空时
class person {
public:
};
int main() {
	person p;
	//c++编译器会给每个对象分配一个字节空间,用来区分不同的对象,即对象所占内存位置也是不同的
	cout <<"size of p="<< sizeof(p) << endl;  //输出的结果是1
  • 当类内含一个成员变量时
class person{
public:
    int m_a;  //非静态成员变量
};
int main(){
    person p;
    //这样建立后的对象含有一个为int型的变量的属性,故输出字节为4
    cout<<"size of p:"<
  • 当类内含静态成员变量或者(静态/非静态)成员函数时,并不增加对象所占的字节
    class person{
    public: 
        void func(){}
        static int m_a;
    }
    int main(){
        person p;
        //输出结果还是1
        cout<<"size of p"<

    2.this指针概念

从上一章我们得知,类内的成员变量是可以分开存储到每个类的对象里,但是成员函数却不会存储到每个对象里面即每一个非静态成员函数只诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么有一个问题?c++-类和对象-this指针和const_第1张图片

 这一块代码是如何区分哪个对象调用自己呢?

即c++通过提供特殊的对象指针,即this指针,this指针指向被调用成员函数所属的对象

this指针是隐含在每一个非静态成员函数内的一种指针,不需要定义,直接使用即可

  • this指针的用途

1.当形参和成员变量同名时,可用this指针来区别

2.在类的非静态成员函数中返回对象本身,可以使用return *this(this是一个指针,指向的地址是类的对象,即解引用是指该类的对象

第一种用途

class person{
public:
    person(int age){  //构造函数
        age=age;
    }
    int age;
}
int main(){
    person p=18;
    cout<<"p的年龄是:"<

03f759c8da364b518a54bb2f4970de27.png

这样输出的结果是-858993460,显然错误

0f9a7027d0fe4e65b742f15a3703c003.png

 是因为编译器把这三个age认为是同一个,而你初始化的操作,并没有初始化到int age(这个是成员变量,不是刚才的形参变量),所以输出的是一个错误的值

以下是正确this指针用法

class person{
public:
    person(int age)
    {
        this->age=age;
    }
    int age;
}
int main(){
    person p=18;
    cout<<"p的年龄是:"<

只需要在aged=age前加一个指向类对象的指针即可(或者将类的成员变量名的设置与构造函数的形参不同即可)

第二种用途(return *this)

class person{
public:
	person (int age) {  //构造函数
		m_age = age;
	}
	person &add_age(person &p) {
		//将p1的年龄加到p2上面去
		m_age += p.m_age;
		return *this;
	}
	int m_age;
};
int main() {
	person p1 = 10;
	person p2 = 10;
	p2.add_age(p1);
	cout << "p2的年龄是:" <

通过构造person &(返回引用的方式)为返回值类型的函数,将p1的年龄加到p2上去;

如果返回值类型是person(返回值的方式),则返回的不是p2的本体,因为会调用拷贝构造函数

注意:返回的值只能写*this,不能写p2

还可以通过p2.add_age(p1).add_age(p1).add_age(p1)这样的嵌式调用,无限将p1的值加到p2上

(这里有些难理解,可以多看几遍)

记住构造函数内也含this指针c++-类和对象-this指针和const_第2张图片

3.const修饰成员函数

常函数是什么

  • 成员函数后加const后称之为常函数
  • 常函数内不可以修改成员属性
  • 成员属性声明时加上关键字multable后,在常函数内仍可以修改

常对象又是什么

  • 声明对象前加const称之为常对象
  • 常对象只能调用常函数

常函数示例

#include
using namespace std;
class person {
public:
	void set_age()const {
		m_age = 18;
	}
	int m_age;
};
int main() {
	person p;
	p.set_age();
	return 0;
}

产生了这样的错误

2d60052d6e3e48f2998eb0ab65216eb0.png

 为什么呢?从上节我们知道在成员函数中内含this指针,则本质是this->m_age=18,而我们规定this指针是一个指针常量,是一个不可以被修改的指针,即person * const this(指的是this的值不可以被修改),而在成员函数后加了const,就变成const person *const this(指针的值和指针指向的值都不可以被改变)

然而,在变量中加上mutable关键字后(mutable int m_a;),即使在常函数中,也可以修改这个值

常对象示例

class person {
public:
	void func(){
		m_a = 10;
	}
	int m_a;
	mutable int m_b;
};
int main() {
	const person p;
	p.m_a=10;
	p.m_b=10;
	p.func();
	return 0;
}

显示的结果如下

c++-类和对象-this指针和const_第3张图片

 在p调用m_age和func()时都出现了报错,证明常对象只能调用常函数以及带mutable关键字的成员变量

为什么常对象不能调用普通成员函数,因为普通成员函数可以修改成员变量的值,若能调用普通成员函数,就从侧面修改了普通成员变量的值,而这是类对象所做不到的

别往下翻了,就到这里了

c++-类和对象-this指针和const_第4张图片

 

 

 

 

你可能感兴趣的:(c++,算法,开发语言)