1、成员变量和成员函数
#include using namespace std; #include //成员变量和成员函数分开存储 class Person { int m_A;//非静态成员变量 属于类的对象上的 static int m_B;//静态成员变量 不属于类的对象上 void func() {} //非静态成员函数 不属于类的对象上 static void func2(){}//静态成员函数 不属于类的对象上 }; int Person::m_B=0; void test01() { Person p; //空对象占用内存空间为:1 //c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置 //每个空对象也应该有一个独一无二的内存地址 cout << "size of p = " << sizeof(p) << endl; } void test02() { Person p; cout << "size of p = " << sizeof(p) << endl; } int main() { //test01(); test02(); system("pause"); return 0; }
2、this指针的用途
#include using namespace std; #include class Person { public: Person(int age) { //this指针指向 被调用的成员函数 所属的对象 this->age = age; } Person& PersonAddAge(Person &p) { this->age += p.age; //this指向p2的指针,而*this指向的就是p2这个对象本体 return *this; } int age; }; //1、解决名称冲突 void test01() { Person p1(18); cout << "p1的年龄为:" << p1.age << endl; } //2、返回对象本身用*this void test02() { Person p1(10); Person p2(10); /*p2.PersonAddAge(p1); cout << "p2的年龄为:" << p2.age << endl;*/ //链式编程思想 p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1); cout << "p2的年龄为:" << p2.age << endl; } int main() { //test01(); test02(); system("pause"); return 0; }
3、空指针访问成员函数
#include using namespace std; #include class Person { public: void showClassNmae() { cout << "this is Person class" << endl; } //报错原因是因为传入的指针是为NULL void showPersonAge() { if (this == NULL) { return; } cout << "age = " << m_Age << endl; } int m_Age; }; void test01() { Person* p = NULL; p->showClassNmae(); //p->showPersonAge();报错 } int main() { test01(); system("pause"); return 0; }
4、const修饰成员函数
常函数:
- 成员函数后加const后我们称为这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
#include using namespace std; #include //常函数 class Person { public: //this指针的本质 是指针常量 指针的指向是不可以修改的 //const Person * const this; //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改 void showPerson() const{ this->m_B=100; //this->m_A = 100;//this指针是不可以修改指针的指向的 //this = NULL; } void func() { } int m_A; mutable int m_B;//特色变量,即使在常函数中,也可以修饰这个值 }; void test01() { Person p; p.showPerson(); } //常对象 void test02() { const Person p;//在对象前加const,变为常对象 //p.m_A = 100; p.m_B = 100;//m_Bs是特殊值,在常对象下也可以修改 //常对象只能调用常函数 p.showPerson(); //p.func();//常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性 } int main() { test01(); test02(); system("pause"); return 0; }