常量成员函数调用成员函数为什么不能调用非常量成员函数调用成员函数

您所在的位置: &
C++基础:常量成员函数特殊说明
C++基础:常量成员函数特殊说明
本文介绍的是C++的基础知识,常量成员函数的特殊说明,希望对你有帮助,一起来看。
下面介绍的是C++中的常量成员函数特殊说明。
1. 传指针时,我们可以通过指针来修改它在外部所指向的内容。但如果要修改外部指针所指向的对象是不可能的。例如传递外部指针到函数内来分配空间,必须传递指针的指针或指针的引用。
char&carry[10]&=&{0};&&
编译器会将其后所有的东西都置0;
3. 函数返回值为const时,返回的东西付给一个类型相同的标示后其不能为左值;
const&int&*i;& &int&const&*i;& &int&*&const&i;&&
前两个功能相同,说明I所指向的内容不变;最后一个说明指针指向的地址不变,但内容可变。
5. 类中的const成员函数。定义为在原型后加const。常量函数不能修改类中的任何属性。但有两种方法可以修改。
{(myclass&*)this-&member1&=&}&
b) 将一个成员定义成mutable即可被常量函数修改。
6. 类中的常量const 类型的,不能在类中被用来定义数组。而
enum&{ONE=100;&TWO=2};&
定义的ONE、TWO却可以。通常的enum定义的置分配问题:
enum&A{&L=9,&Z};&
此时Z的值为10。
7. 用const定义的int可用来开辟数组,但const定义的常量数组中的元素,不能用来定义数组。
8. 用sizeof计算变量的空间,如果是数组,按实际空间返回;常量字符串(实际上是在静态内存区开辟的变量)sizeof返回比实际长度加一。如果是指针则不考虑它指向的空间大小,仅仅返回指针类型的大小。如果用sizeof计算函数的行参,即使是属组也仅仅返回一个相关类型指针的大小。
int&iarray[]&=&{12,&124,&433};&
编译器会自动给iarray分配3个元素的长度。元素长度的个数计算公式为sizeof(iarray) / sizeof(*iarray)。
10. 拷贝构造函数:当行参和实参结合时,如果是复杂对象的传值类型,则调用拷贝构造函数生成一个临时对象作为实参,退出函数时,临时对象被调用析构函数释放。当返回值是复杂对象是,也是调用拷贝构造函数来赋值。这就出现构造函数和析构函数被调用次数不相等的情况。拷贝构造函数的原型为A(A&),我们可在类中重载。(缺省的拷贝构造函数是使用位(bit)拷贝方法:浅层拷贝,不拷贝指针指向的内容)。
11. volatile类型的变量告诉编译器,本变量不需要进行代码优化。在多线程的应用中,我们如果读入一个变量到寄存器,此时时间片到期,去处理其他线程了,在重新获得处理机时,volatile类型告诉处理机,重新从变量读取数据到寄存器,而不是用寄存器数据直接处理,这样可以防止脏数据。
12. class 和struct在一定程度上有相同的功能,只不过前者缺省的成员是私有的,后者在缺省时成员为共有的。故而class不是c++必需的保留字
13. c和c++编译器,对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用extern &C&告诉编译器,它是c的函数,按c的规则编译。通常我们使用的标准头文件已被处理过。
#include&&filename&;&&
#include ,前者先在当前目录下寻找文件,如果找不到再到系统规定的路径下找,后者直接到系统规定的路径下找。
15. 任何地方分配的静态变量(static),其生命周期和主进程相同。第二次定义一个已存在的static变量,对变量的内用无影响,但它的可见范围只在定义的范围内。(考研曾作错!)(从静态变量的特性不难理解,类中的static类型是所有对象共享的)
16. 内联函数(inline)在实现上实际和宏类似,在内联函数出现的地方将函数展开来避免函数调用时的出栈、如栈,提高效率。但内联函数的代价是:代码增大。inline函数适合成员函数和自由函数。在类中实现的函数自动为内联函数。inline必须定义到函数的实现上,例如:inline int PlusOne(int) 是无效的。友元函数在类的体内被实现自动变为内联函数。
17. #include
#define DEBUG(X) cout&&#X&=&&
其中的#X表示X被当作字符串输出。
assert(0&!=&0);&&
如果assert中的条件为假,则运行期间回退出程序,且报告出错代码的行号。(#include )
19. 静态对象在main结束或exit()被调用时才调用自身的析构函数。这意味着,在对象的析构函数中调用exit()是很危险的,有可能进入一个死循环中。调用abort()来退出函数,静态对象的析构函数并不会被调用。我们可以用atexit()来指定跳出main或调用exit时要执行的操作,用atexit注册的函数,可以在所有对象的析构函数之前调用。
void&exit_fn2(void)& &{& &printf(&Exit&function&#2&called\n&);& &}&&atexit(exit_fn2);&
20. 全局变量实际上用的是静态存储。静态变量的构造是在进入main之前调用的,在main结束时调用它的析构函数。变量的名字由小范围(c++而言):
&int&a;&&static&int&b;&&main() &{&}&
类的静态成员变量可以如下赋值:
int&X::s=23;(在*.cpp中,无论公私都可以)&
21. 名字空间(namespace): 定义一个名字空间,然后使用unsing就可以将当前的类型上下文转换名字空间所定地的.
namespace&math& &{& &enum&sign{positive,&negative};& &class&integer{& &int&i;& &sign&s;& &public:& &interger(int&I=0):&i(i)&{&&&}& &sign&Sign()&{&&&}& &&&&&&&&..& &};&interger&A,&B,&C;& &interger&divide(interger,&interger);& &}&void&q()& &{& &using&namespace&& &interger&A;&&A.Sign(negative);& &Math::A.Sign(positive);& &}&
22. 一般对于函数flaot f(int a, int b); 某些c++编译器编译后生成_f_int_int的名字,有些c编译器则生成_f的名字。故在c++中链接c的库函数时要用extern &C&告诉编译器,按c的规则来编译函数。类似的还有extern &C&{#include &myhead.h&},c++还支持extern &C++&{}.
23. 在函数调用时,传引用也是将指针压栈。
24. 构造函数、析构函数、赋值构造函数、重载的=,四者的调用顺序:(三种函数都已实现)
X&x;&X&a=x;& &result:& &X:construct& &X:copy_struct& &b)&X&x;&X&a;&a=x;& &Result:& &X:construct& &X:construct& &X:copy_stru& &operator&=& &X:destruct&
如果没有赋值构造函数则结果:
X:construct& &X:construct& &operator&=& &X:destruct&
(如果直接X a=x;这不掉用一般的构造函数,调用复制构造函数)
指向类的成员函数的指针:设 int X:: a(void){}
X&x;& &int&(X::&*pf)(void)=&&X::a; &(x.*pf)();&
指向成员变量的指针: 设 是X的成员变量
int&X::*pm&=&&X::i; &X&x;&
希望通过本文的介绍,能够给你带来帮助。【编辑推荐】【责任编辑: TEL:(010)】
关于的更多文章
Linux之父对C++进行了炮轰,说它是糟糕程序员的垃圾语言,可谓是
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
9月的工作日被法定假日拆的零零散散,不知道各位的工
总结一下Java I/O文件读写基本类相关知识和概念。对于
今天是被国际上众多科技公司和软件企业承认的业内人士
本书依据最新版《软件设计师考试大纲》的考核要求,深入研究了历年软件设计师考试试题的命题风格和试题结构,对考查的知识点进行
51CTO旗下网站只有常量版本的成员函数才能被类的常量对象调用?【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:283,910贴子:
只有常量版本的成员函数才能被类的常量对象调用?收藏
RT一个类A,里面有方法method1()method2();如果声明const A instance1;和
A instance2;这里的instance1是只能调用method1()是吗?谢谢了!还想问下size_t 和std::size_t有什么区别?
AutoTDS-V1型全自动热解吸仪是一款20位常温二次全自动热解吸仪,气路采....
const对象只能调用const的成员函数更恰当不是么
size_t看在哪个命名空间找。::std::size_t和::size_t是同一个类型,通过不同的标准库头引入。
对,常类只能调用常版本函数,
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或后使用快捷导航没有帐号?
查看: 220|回复: 0
理解常量成员函数
主题帖子积分
猿er, 积分 2188, 距离下一级还需 812 积分
猿er, 积分 2188, 距离下一级还需 812 积分
这是一个c++多态练习的程序,其实我当初写的时候遇到的最大的问题就是常量成员函数,所以,这段代码包含了大量的常量成员函数,希望对大家理解c++的常量成员函数有个参考。
#include&iostream&#include&iomanip&using std::#include&string&using std::#include&Employee.h&#include&SalariedEmployee.h&#include&CommissionEmployee.h&#include&HourlyEmployee.h&#include&BasePlusCommissionEmployee.h&//double Add(double a, double b)//可以接收常量//{// // c = a +// //}//double Add(const double a, const double b)//函数可以接收常量//const修饰函数返回值,一般函数返回值是指针或者引用时用const修饰返回值有意义,//但是,若函数以按值传递方式返回函数值,则加const修饰返回值没什么意义,因为返回值会被复制到//临时开辟的内存空间。//{// // return (c = a + b);//}//class A//{//public:// A()// {//
cout && &This is an empty string!& &&// }//// A(const string &ms)// {//
SetMyString(ms);// }// double Add(const double a, const double b) const//
//常量成员函数只能修改类的常量成员!//
//这句话表达了两个意思://
//(1)常量成员函数只能访问类的常量成员函数!//
//(2)常量成员函数不能修改类的数据成员!//
//由(1)(2)可知,常量成员函数只是限定类的成员的修改权限!//
//因为a,b,c不是类的数据成员,所以可以修改!// {//
return (c = a + b);// }//// void SetMyString(const string &ms)// {//
MyString =// }//// string GetMyString() const// {//
return MyS// }////private:// string MyS//};int main(){ /*A cout && aa.GetMyString();*/ //SalariedEmployee mySalariedEmployee(&马云&,&计算机&); //CommissionEmployee myCommissionEmployee(&马化腾&,&网络&,1); //const CommissionEmployee cCommissionEmployee(&习近平&,&国家主席&,30000,1); //CommissionEmployee rCommissionEmployee(cCommissionEmployee); //const SalariedEmployee cSalariedEmployee(&马赛克&,&日本&,1000); //SalariedEmployee rSalariedEmployee(cSalariedEmployee); //Employee* EmployeePtr = &mySalariedE //EmployeePtr-&print();//调用派生类成员函数 //cout && EmployeePtr-&GetName() && //cCommissionEmployee.print(); //rCommissionEmployee.print(); //cSalariedEmployee.print(); //rSalariedEmployee.print(); //mySalariedEmployee.print(); //cout && myCommissionEmployee.GetRever() && ' ' && myCommissionEmployee.GetRatio() && //cout && myCommissionEmployee.GetSalary() && //myCommissionEmployee.print(); //double a = 1, b = 1; //cout && &1 + 1 = & && Add(a, b) && /*cout && Add(1, 1) && &
& && Add(a, b) && cout && aa.Add(1, 1) &&*/ BasePlusCommissionEmployee baseplus(&温家宝&, &总理&,20000,1); baseplus.print(); return 0;}复制代码
上一篇:下一篇:

我要回帖

更多关于 构造函数调用成员函数 的文章

 

随机推荐