如下语句将出现编译错误:
char *str = GetString();
正确的用法是:
const char *str =GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 例如:
不要将函数 int GetInt(void) 写成 const int GetInt(void)。
同理不要把函数A GetA(void) 写成const A GetA(void),其中A为用户自定义的数据类型。
如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A &GetA(void)的确能提高效率。 但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如: class A { A & operate = (const A &other); // 赋值函数 }; A a, b, c; // a, b, c 为A的对象 a= b = c; // 正常的链式赋值 (a= b) = c; // 不正常的链式赋值,但合法 如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a= b = c 仍然正确,但是语句(a= b) = c 则是非法的。第三:const 成员函数 任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。 class Stack { public: void Push(int elem); int Pop(void); int GetCount(void) const; // const 成员函数 private: intm_num; int m_data[100]; }; int Stack::GetCount(void) const { ++ m_num; // 编译错误,企图修改数据成员m_num Pop(); // 编译错误,企图调用非const函数 returnm_num; } const 成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。 关于Const函数的几点规则: a.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数. b.const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的. c.const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查. e.然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的 补充: 标题:const放在后面有什么意思? -------------------------------------------------------------------------------- 一个函数 AcGePoint3dstartPoint() const; const放在后面跟前面有区别么 ==> 准确的说const是修饰this指向的对象的 譬如,我们定义了 class A{ public: f(int); }; 这里f函数其实有两个参数,第一个是A*const this, 另一个才是int类型的参数 如果我们不想f函数改变参数的值,可以把函数原型改为f(const int),但如果我们不允许f改变this指向的对象呢?因为this是隐含参数,const没法直接修饰它,就加在函数的后面了,表示this的类型是const A *const this。 const修饰*this是本质,至于说“表示该成员函数不会修改类的数据。否则会编译报错”之类的说法只是一个现象,根源就是因为*this是const类型的以上的内容转自:https://www.cnblogs.com/azbane/p/7266747.html还可以参考以下的内容: https://blog.csdn.net/zhou199019901990/article/details/38553227 C++中const在函数名前面和函数后面的区别
一、概念
当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。
二、原理:
我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向const类型对象的const指针。
具体示例:
一个函数名字后有const,这个函数必定是成员函数,也就是说普通函数后面不能有const修饰,如:int print( ) const {.......} 这个函数必定为成员函数,即在类里面定义的函数。
在一个类里定义了一个const成员函数后,则此函数不能修改类中的成员变量,如果定义了一个类的const对象(非const对象可以调用const成员函数和非const成员函数 ),它只能调用类中的const成员函数,如:
class text{ public: void print_const(void) const //有const修饰 { cout<<"hello"<<endl; } void print(void) {cout<<"hello"<<endl;} //没有const修饰 void getk(void) const {k=5; }//错误,有const修饰,不能修改k的值, private: int k; }; const text a; int main() { a.print(); //错误,const对象只能调用 a.printf_const(); //正确 } // void print() const {} 和 void print() {}是重载函数,假如对象为const,则调用void print () const成员函数,如果为非const,则调用void print() ; class text{ public: void print(void) const {cout<<"hello_const"<<endl;} void print(void) {cout<<"hello"<<endl;} }; const text a; int main() { a.print(); //屏幕输出 hello_const 假如对象a 定义为 text a,则输出 hello return 0; }
还可以参考以下的博客:
https://www.cnblogs.com/xing901022/p/3413019.html
函数声明后面的const用法
// test1107.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class aa{ int num; public: aa(){ int b =10; num = b; }; void out1(){ cout<<num<<endl; } void out2() const{ cout<<num<<endl; } void out3() const{ num+=10; //出错,const函数不能修改其数据成员 cout<<num<<endl; } }; int _tmain(int argc, _TCHAR* argv[]) { aa a1; a1.out1(); a1.out2(); a1.out3(); const aa a2; a2.out1(); // 错误,const的成员 不能访问非const的函数 a2.out2(); a2.out3(); return 0; }在类成员函数的声明和定义中,
const的函数不能对其数据成员进行修改操作。
const的对象,不能引用非const的成员函数。
调用使用情况总结如下图:
转载于:https://www.cnblogs.com/doker/p/11051175.html