第十七课:对象的构造(上)----------狄泰软件学院
来源:互联网 发布:百叶窗材质 知乎 编辑:程序博客网 时间:2024/04/29 10:09
一、对象中的成员变量是多少?
类也属于自定义类型,故其定义出来的对象也是变量,既然是变量就会在内存中占有一席之地。
1.若定义局部的对象调用公有函数,可得i是随机值(会在栈上)
2.若定义全局的对象调用公有函数,可得i的值为0(会在全局数据区占用存储空间)
3.若定义一个类指针指向一个类的对象,在堆空间上产生一个对象,可得i的值为随机值(记得delete掉)
#include<iostream>using namespace std;class Test{private: int i; int j;public: int getI() { return i; } int getJ() { return j; }};Test t1;int main(){ Test t2; Test *t3 = new Test; printf("t1.getI()=%d,t1.getJ()=%d\n", t1.getI(), t1.getJ());//全局的,最后打印i和j的值都为0 printf("t2.getI()=%d,t2.getJ()=%d\n", t2.getI(), t2.getJ());//在栈上,最后打印i和j的值都为随机值 printf("t3->getI()=%d,t3->getJ()=%d\n", t3->getI(), t3->getJ());//在堆上,最后打印i和j的值都为随机值 system("pause"); return 0;}
二、程序中如何对一个对象进行初始化
解决方法一:定义一个公有的initialize()函数来初始化,定义对象之后立即调用来进行初始化
#include<iostream>using namespace std;class Test{private: int i; int j;public: int getI() { return i; } int getJ() { return j; } void initialize() { i = 1; j = 2; }};Test t1;int main(){ Test t2; Test *t3 = new Test; t1.initialize(); t2.initialize(); t3->initialize(); //最后打印的值都为i = 1,j = 2 printf("t1.getI()=%d,t1.getJ()=%d\n", t1.getI(), t1.getJ()); printf("t2.getI()=%d,t2.getJ()=%d\n", t2.getI(), t2.getJ()); //t2.initialize();//若是在这里使用后再定义就又会是随机值了 printf("t3->getI()=%d,t3->getJ()=%d\n", t3->getI(), t3->getJ()); system("pause"); return 0;}
这种方法缺点是定义对象后要马上显示调用,忘了调用或者使用变量后再调用在栈和堆上就又是随机值了
解决方法二:c++的构造函数(无返回值。对象定义时自动被调用)
#include<iostream>using namespace std;class Test{private: int i; int j;public: int getI() { return i; } int getJ() { return j; } Test()//构造函数,无返回值,可以有参数,对象定义时自动被调用 { printf("Test() Begin\n"); i = 1; j = 2; printf("Test() End\n"); }};Test t1;int main(){ Test t2; Test *t3 = new Test; //t1.initialize(); //t2.initialize(); //t3->initialize(); printf("t1.getI()=%d,t1.getJ()=%d\n", t1.getI(), t1.getJ()); printf("t2.getI()=%d,t2.getJ()=%d\n", t2.getI(), t2.getJ()); printf("t3->getI()=%d,t3->getJ()=%d\n", t3->getI(), t3->getJ()); system("pause"); return 0;}
小结:
每个对象在使用前都应该初始化
类的构造函数用于对象的初始化
构造函数与类名同名,无返回值
构造函数在对象创建时会自动被调用
0 0
- 第十七课:对象的构造(上)----------狄泰软件学院
- 第二十一课:对象的构造顺序----------狄泰软件学院
- 第十八课:对象的构造(中)----------狄泰软件学院
- 第十九课:对象的构造(下)----------狄泰软件学院
- 第二十二课:对象的销毁----------狄泰软件学院
- 第二十三课:神秘的临时对象----------狄泰软件学院
- 第三十五课:函数对象分析----------狄泰软件学院
- 第二十七课:二阶构造模式----------狄泰软件学院
- 第十七课 面向对象的基本概念(2)
- 第二十课:初始化列表----------狄泰软件学院
- 第三十七课:智能指针分析----------狄泰软件学院
- 第二十五课:类的静态成员变量----------狄泰软件学院
- 第二十六课:类的静态成员函数----------狄泰软件学院
- 第二十八课:友元的尴尬能力----------狄泰软件学院
- 第三十课:操作符重载的概念----------狄泰软件学院
- 第三十一课:完善的复数类----------狄泰软件学院
- 第三十四课:数组操作符的重载----------狄泰软件学院
- 第三十八课:逻辑操作符的陷阱----------狄泰软件学院
- MyEclipse 2017 CI 1 for Windows
- cocoapods 升级到指定版本
- flask
- eclispe+springMVC开发乱码问题
- js清除浏览器缓存的几种方法
- 第十七课:对象的构造(上)----------狄泰软件学院
- SylixOS实时以太网浅析
- 2016 Android Top 10 Library
- easyui 分页表格插件带搜索
- eventbus的使用
- [BZOJ2618][Cqoi2006]凸多边形(半平面交)
- tomcat服务器运行时拦截并中断未处理请求方便服务器随时重启
- 【C#】【WPF】Button按钮动态设置Background背景颜色
- Android App开发从零开始之入门篇(二)—Android Studio的基本使用