你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!
成员变量和成员函数分开存储
①是否属于类对象上?
意为在内存空间中是否在类起始的位置并紧挨着。
非静态成员变量——属于类对象上;
静态成员变量——不属于;
非静态成员函数——不属于;
静态成员函数——不属于。
②空对象占用内存
空对象占用内存为1,若对象中存在成员变量,则按照成员变量大小来划分。
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存位置。
每个空对象也应该有一个独一无二的内存地址。
代码:
#include<iostream>
#include<string>
using namespace std;
class Empty{
};
class Person{
int person_age;
public:
static string person_name;
void test_01(){
cout<<"person 类 test_01测试案例。"<<endl;
}
void test_02(){
cout<<"person 类 test_02测试案例。"<<endl;
}
};
static string person_name = "张三";
void test_020510_0(){
Empty empty;
cout<<"Empty类的大小为:"<<sizeof(empty)<<"."<<endl;
}
void test_020510_1(){
Person person;
cout<<"Person 类的单独对象大小为:"<<sizeof(person)<<"."<<endl;
}
int main(){
test_020510_0();
test_020510_1();
system("pause");
return 0;
}
test_020510_0()
函数的运行结果为:
说明空类为了占位置(暂时当作这个原因),而内存设置为1。
test_020510_1()
函数的运行结果为:
说明只有非静态成员对象成员变量和类对象是一体的,占内存大小为4字节,静态成员变量,静态成员函数或非静态成员函数都没有和类对象的位置绑定到一块。
this指针概念
C++中成员属性和成员函数是分开存储的。
每一个非静态成员函数只会诞生一份函数实例==多个同类型的对象会公用一块代码。
this指针是隐含每一个非静态成员函数内的一种指针。
this指针不需要定义,直接使用就行。
第一句话通过成员属性和成员函数分开存储已经证明,第二句话意为普通的成员函数,多个同类型的对象都会用。(但这不是应该的吗?)
this指针需要掌握:①this指针的用途之——解决变量重命名的问题。②this指针可以作为返回值,返回被调用成员函数的对象本身。
第一个知识点:如何解决变量重名名
#include<iostream>
#include<string>
using namespace std;
class Person{
public :
int age;
Person(int age){
cout<<"Person 的类构造函数正在调用。"<<endl;
age = age;//这里就显示3个age是同一个age,加上指针后说明age只是类对象里面的。
//this->age = age;
cout<<"Person 的变量值为:"<<Person::age<<"。"<<endl;
}
};
void test_020511_0(){
Person person(30);
}
int main(){
test_020511_0();
sytem("pause");
return 0;
}
运行结果如下
可以看到,变量名重复了,对应变量值就没法传进来。
加上this指针后(9行注释,10行取消注释),运行结果如下:
可以看到,加上this指针后确实可以避免变量命名重复问题。
第二个知识点:this作为返回指向当前对象的指针
this指针还有一个用处:可以返回当前所对应对象的指针。
比如将代码:
#include<iostream>
#include<string>
using namespace std;
class Person {
public:
int age;
Person(int age) {
cout << "Person 的类构造函数正在调用。" << endl;
age = age;//这里就显示3个age是同一个age,加上指针后说明age只是类对象里面的。
this->age = age;
cout << "Person 的变量值为:" << Person::age << "。" << endl;
}
Person& add_age(Person &person) {
this->age += person.age;
return *this;//这里为什么用解引用?
//this指向对象的指针,加※代表指向的是对象本体
}
};
void test_020511_0() {
Person person(50);
person.add_age(person).add_age(person).add_age(person);
cout<<"person age += 3次后,age = "<<person.age<<"."<<endl;
}
int main(){
test_020511_0();
system("pause");
return 0;
}
运行结果如下,可以看到当返回值为this指针所指向的对象时,多次add_age(Person person)
函数后,将每次的返回对象作为引用传回去,最后的年龄从左向右加了3次。
但是如果传入的参数,返回值为值,那就只是在内存空间中拷贝了一份对象加减,调用完函数之后又自动销毁,导致有两次的add_age()
函数对想要的效果相当于没用。
复读
①this指向对象的指针,加※代表指向的是对象本体。
Person& add_age(Person &person) {
this->age += person.age;
return *this;//这里为什么用解引用?
//this指向对象的指针,加※代表指向的是对象本体
}
②链式编程思想
person.add_age(person).add_age(person).add_age(person);
以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!