网站买空间的价格,制作书签简单又漂亮,网站权重等级,长沙app开发公司排名笔记复习
1.C对象模型
在C中#xff0c;类内的成员变量和成员函数分开存储
我们知道#xff0c;C中的成员变量和成员函数均可分为两种#xff0c;一种是普通的#xff0c;一种是静态的#xff0c;对于静态成员变量和静态成员函数#xff0c;我们知道他们不属于类的对象…笔记复习
1.C对象模型
在C中类内的成员变量和成员函数分开存储
我们知道C中的成员变量和成员函数均可分为两种一种是普通的一种是静态的对于静态成员变量和静态成员函数我们知道他们不属于类的对象事实上非静态成员函数也即普通的成员函数也不属于类的对象。只有非静态成员变量也即普通的成员变量才属于类的对象。
下面是代码示例的完整代码
#includeiostream
using namespace std;class person {int m_A;static int m_B;void func() {}static void func1() {}
};void test01() {person p;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;
}
在C中空对象的内存空间为一个字节这是由C编译器分配的目的是为了区分空对象占内存的位置这样每个对象都会有独一无二的内存地址当我们删除person类中的代码运行程序后将会输出两个1
#includeiostream
using namespace std;class person {
};void test01() {person p;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;
} 前面我们讲到只有成员变量才属于C的对象因此我们在空类的基础上写入成员函数静态成员变量静态成员函数这个类的对象也依旧是空对象
#includeiostream
using namespace std;class person {static int m_B;void func() {
}static void func1() {}
};void test01() {person p;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指针
我们知道当我们创建并调用类的对象时这些对象会共用类中的成员函数那么这些函数如何区分时哪个对象调用自己呢这时候就有了this指针C通过提供this指针来解决该问题。
this指针是一种特殊的指针this指针指向被调用成员函数的所属的对象this指向整个对象而不只是对象里面的成员。在非静态成员函数内部你可以使用 this 指针访问调用对象的成员。this 实际上是当前类类型的指针例如对于类Kunkun的成员函数this 是 Kunkun 类型的指针。
作用
1解决变量命名冲突
2在类的非静态成员函数中返回对象本身可使用return*this
this指针还有更多用途但过于复杂这里不再介绍
1解决变量命名冲突
#includeiostream
using namespace std;class person {
public:person(int age) {age age;}int age;
};void test01() {person p1(18);p1.age 18;
}int main() {test01();return 0;
}
在这份代码种person有参函数中的age是赋值给形参即形参赋值给形参并没有将接收到的形参的值赋值给成员变量因此成员变量未初始化当我们运行这个代码的时候就会出现成员变量未初始化的问题这时候我们需要使用this指针
#includeiostream
using namespace std;class person {
public:person(int age) {this-age age;}int age;
};void test01() {person p1(18);p1.age 18;
}int main() {test01();return 0;
}
这里this指针指向被调用函数person有参函数所属对象p1的成员变量age这样就把age区分开了不过在实际的编程中我们会规范化命名尽量避免这种情况出现。
2在类的非静态成员函数中返回对象本身可使用return*this
#includeiostream
using namespace std;class person {
public:person(int age) {this-age age;}person personaddage(person p) {this-age p.age;//将自身的年龄加上传入对象的年龄return *this;//this返回的是person类型的对象因此函数要设置为person类型允许函数返回一个对象的引用而不是一个新的对象返回对象的引用允许多个函数连续调用操作同一个对象}int age;
};void test02() {person p1(10);person p2(10);//链式调用p2.personaddage(p1).personaddage(p1).personaddage(p1);//p2是对象因此p2.personaddage(p1)语法正确而如果没有return *this;//那么返回的数据类型就是int类型int.personaddage(p1)不成立因此需要返回对象cout p2.age endl;
}int main() {test02();return 0;
} 细心的小伙伴可以发现this指针指向一个值的时候我们修改了这个值那么this指针能否修改指针的指向呢答案是不能因此this指针实际上是指针常量指针指向的值可以改变但指针的指向无法改变
3.空指针访问成员函数
C中空指针也可以访问成员函数 若成员函数中未使用到成员变量可使用空指针调用该成员函数 若成员函数中使用了成员变量须对this进行判空操作以防止程序崩溃。
对于第2点也即C无法用空指针来调用成员函数的成员变量
#includeiostream
using namespace std;class person {
public:void showclassname() {cout this is person class endl;}void showpersonage() {if (this NULL) {//没有判空操作时程序会报错return;}cout age this-m_age endl;//this指针指向pp是一个空指针是无法访问属性的}int m_age;
};void test01() {person* p NULL;p-showclassname();p-showpersonage();
}int main() {test01();system(pause);return 0;
}