沈阳企业网站怎样制作妇科医生免费咨询
沈阳企业网站怎样制作,妇科医生免费咨询,中企动力苏州网页设计,网络项目计划书c中的对象的构造顺序与析构顺序
问题一
当程序中存在多个对象时#xff0c;如何确定这些对象的析构顺序#xff1f;
一.单个函数创建时构造函数的调用顺序
1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声明顺序相同) 3.调用类自身的构造函数
而析构函数与…c中的对象的构造顺序与析构顺序
问题一
当程序中存在多个对象时如何确定这些对象的析构顺序
一.单个函数创建时构造函数的调用顺序
1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声明顺序相同) 3.调用类自身的构造函数
而析构函数与对应构造函数的调用顺序相反多个对象析构时析构顺序与构造顺序想反。
下面分析一段简单的代码
#include stdio.h
class Member
{const char* ms;
public:Member(const char* s){printf(Member(const char* s): %s\n, s);ms s;}~Member(){printf(~Member(): %s\n, ms);}
};class Test
{Member mA;Member mB;
public:Test() : mB(mB), mA(mA){printf(Test()\n);}~Test(){printf(~Test()\n);}
};Member gA(gA);int main()
{Test t;return 0;
}首先代码中没有父类那么调用成员变量的构造函数调用的顺序要与声明的顺序相同看代码知先声明的是全局变量Member gA(“gA”)然后是局部变量Member mA; Member mB注意mA和mB这两个变量得顺序不要被 Test() : mB(“mB”), mA(“mA”)这里的定义顺序搞混了我们的构造顺序是声明的顺序而不是定义的顺序那里的定义的顺序是为了给我们造成混淆的定义的顺序可以随便改变接着就是调用类自身的构造函数Test()它会执行printf(“Test()\n”); 好了到这一步说明构造函数调用完成。调用的顺序为gAmAmB,Test().
而析构函数与构造函数的调用顺序相反所以析构函数的调用顺序为~Test(), mB, mA, gA.
对于栈对象和全局对象类似于入栈与出栈的顺序最后构的对象被最先析构 堆对象的析构发生在使用delete的时候与delete的使用顺序相关
问题二
const 关键字能否修饰类的对象如果能有什么特性
我们知道在c中const可以修饰一个只读变量也可以修饰一个真正意义上的常量。那么它能否修饰类的对象呢我们知道类只不过是由struct演变而来的一种用户自定义的数据类型从某种意义上来讲它也是一个变量既然是变量那么能不能用const修饰它呢 答案是肯定的 1.const关键字能够修饰对象 2.const修饰的对象为只读对象 3.只读对象的成员变量不允许被改变 3.只读对象是编译阶段的概念运行时无效 下面介绍一下C中const成员函数的定义
Type ClassName::function(Type p) const类中的函数声明与实际的函数定义都必须带有const关键字。文字太多不如直接上代码
#include stdio.hclass Test
{int mi;
public:Test(int i);Test(const Test t);int getMi();
};Test::Test(int i)
{mi i;
}Test::Test(const Test t)
{mi t.getMi(); //能否编译通过
}int Test::getMi()
{return mi;
}int main()
{const Test t(1);t.mi 100; //能否编译通过printf(t.getMi() %d\n,t.getMi()); //能否编译通过如何才能编译通过return 0;
}我把程序放到linux中进行编译很显然编译不通过显示的错误有哪些呢?
test.cpp: In copy constructor ‘Test::Test(const Test)’:
test.cpp:19: error: passing ‘const Test’ as ‘this’ argument of ‘int Test::getMi()’ discards qualifiers
test.cpp: In function ‘int main()’:
test.cpp:5: error: ‘int Test::mi’ is private
test.cpp:31: error: within this context
test.cpp:31: error: assignment of data-member ‘Test::mi’ in read-only structure
test.cpp:33: error: passing ‘const Test’ as ‘this’ argument of ‘int Test::getMi()’ discards qualifiers首先mi t.getMi();无法编译通过因为Test::Test(const Test t)中的的参数为const的引用const成员函数只能调用const成员函数。 然后t.mi 100;编译不通过因为int Test::mi’ is private并且‘Test::mi’ in read-only structure因为我们定义的是const成员函数const Test t(1);这才是我们想说的真正原因。 其次printf(t.getMi() %d\n,t.getMi());编译不通过 因为成员t在上面被定义的是const类型。 那么该如何让它编译通过呢在int getMi();函数后面加上const变为
int getMi()const;在int Test::getMi()后面加上const变为
int Test::getMi()const那么这条语句 printf(t.getMi() %d\n,t.getMi());就可以编译通过了 此时如果在函数int Test::getMi()中加入 mi 2;则编译又不会通过了因为该函数已经被定义为const类型不能改写成员变量的值了 由以上代码的实际试验得出具体结论如下
C中const成员函数的特性
const const对象只能调用const成员函数const 成员函数中只能调用const成员函数const 成员函数中不能直接改写成员变量的值。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89368.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!