1.首先我们必须知道c++中成员变量和成员函数是分开存储的。
说白了就是:类中的函数代码只有一份,但是数据成员可以有多份,定义几个对象就有几组数据成员,但是他们都共用同一份函数代码,这也符合常理,要是每定义一个对象都要再复制一份代码,那么对内存的浪费是巨大的。c++对内存相当吝啬,当然不允许这种情况出现。
//下面的对象都是指的是 person p中的p,相当于person的一份模板。
class Person {
public:
Person() {
}
1.//非静态成员变量占对象空间(这也是唯一的占用对象空间的量,就是他自己的数据成员)
int mA;
2.//静态成员变量不占对象空间
static int mB;
3.//函数也不占对象空间,所有函数共享一个函数实例
void func() {}
4.//静态成员函数也不占对象空间
static void sfunc() {}
};
2.this指针。
(1)引入背景:我们已经知道c++中成员变量和成员函数是分开存储的。
当有多个同类型的对象存在时,每个对象会共用同一份函数代码。那么函数如何去区分哪个对象调用的自己呢?我函数把结果返回给哪个对象哪? 没有方向可不行。
这时候c++就引入了this对象指针,而且我们不用自己定义,系统自带的指针,我们直接用就行。
this指针即为指向调用函数的对象的指针。
this指针是隐含每一个非静态成员函数内的一种指针,静态不行,静态就一份
(2)this指针的作用
(i)当形参和成员变量同名时,用this指针来区分哪个是形参,哪个是成员变量。
例:
//1.正常代码
class person{
public:
int age;
person(int age){
this->age=age;
}
};
int main(){
person p(18);
cout<<p.age<<endl;
}

//2.不加this时
class person{
public:
int age;
person(int age){
age=age;
}
};
int main(){
person p(18);
cout<<p.age<<endl;
}

(ii)在类的非静态成员函数中返回对象本身,可使用return *this
return *this的使用格式也有限制。通常用在链式作用。
(下面的代码很有趣,可以自己改改看看有什么不同的反应)。
class person{
public:
int age;
person(int age){
this->age=age;//this功能1,区分对象的数据成员和形参。
}
//注意点1:如果要使用this指针,必须把函数返回值类型改成类的类型,还必须改成引用返回
person &add(person p){
this->age += p.age;
return *this;
}
};
int main(){
person p1(18);
person p2(18);
p2.add(p1).add(p1).add(p1).add(p1);
//使用引用返回时p2.add(p1)返回的就是p2更新后的值,如果不加&,返回的就是一个新对象,后面的一串add就是和每次返回的新对象起作用的,而不是和p2,下面会贴一个不使用的代码,自己体会区别。
cout<<p2.age<<endl;
}

//不使用引用返回时的情况,
class person{
public:
int age;
person(int age){
this->age=age;
}
//注意点1:如果要使用this指针,必须把函数返回值类型改成类的类型,还必须改成引用返回
person add(person p){
this->age += p.age;
return *this;
}
};
int main(){
person p1(10);
person p2(10);
p2.add(p1).add(p1).add(p1).add(p1);//add没有加引用,所以第一次add后返回的不是p2本体。
cout<<p2.age<<endl;
}

附实验程序:
#include <iostream>
using namespace std;
class sjx{
public:
int a,b;
sjx(int a,int b){
this->a=a;
this->b=b;
}
sjx &add(sjx &s){
this->a+=s.a;
this->b+=s.b;
return *this;
}
};
int main(){
sjx s1(1,2);
sjx s2(3,4);
s1.add(s2).add(s2);
cout<<s1.b<<endl;
cout<<s1.a<<endl;
}

博客介绍了C++中成员变量和成员函数分开存储的特性,即类中函数代码只有一份,数据成员可有多份,各对象共用函数代码以节省内存。还阐述了this指针引入的背景,是为解决多对象共用函数代码时的调用区分问题,以及其能区分同名形参和成员变量的作用。
999

被折叠的 条评论
为什么被折叠?



