c++ 函数的返回类型,包括const 什么时候起作用呢?

  • 函数返回值不想其立即修改的。

  例子如下,这是一个简单的避免产生隐形返回变量的方法,abc 的函数返回是引用,main函数中第10行,++ 操作是基于 const int & 类型,所以会出错,但以后对改引用的操作不会受到const 约束。

  这样的好处是避免了函数返回值与操作符的逻辑错误结合,例如下面的例子中函数返回的++,对于main 函数是不直观的,进一步的应用是在操作符重载方面,见下一情况说明。

 const int & abc(int a,int b,int &re)
{
re = a+b;
return re;
} int main()
{
int a = ,b =,c;
abc(a,b,c)++; /////////////////////错误
c++; /////////////////////正确
cout<<c<<endl;
return ;
}

  • 重载运算符符合逻辑

  一般变量赋值a=b=c,这是没有问题的,但是(a=b)=c 编译会出错,这是内置操作符的判断,如果对 = 操作符重载了,为了避免这样的逻辑错误,需要在返回类型上加上const 约束,下面例子中A类重载了运算符 +,如果第6行中返回类型没有const 约束,那么15行编译会通过,场景如果是:if(a+b==c) 误写为 if(a+b=c)。

  + 运算符重载加const 约束 对 a+b+c 这样的运算没有影响,因为a+b 运算的结果是const ,但对其只是只读操作,会创建一个新的 A 类返回。

 class A
{
public:
int a;
A(int b):a(b){}
friend const A operator +(const A& lft,const A& rgt)
{
return A(lft.a + rgt.a);
}
}; int main()
{
A a(),b(),c();
a+b = c; /////////错误
return ;
}

  • 通过函数创建指向常量的指针

  如果通过函数来创建常字符串,除了在main 函数中约束之外,也可以在函数返回类型中约束,第一行中左边的const 约束了返回的是常字符串的指针索引,因为它的存在12行必须声明为 const char *p,如果第一行左边const 不存在,那么12行可以加可以不加const,这样约束常字符串的效果只能在main 中反映,不能很好的表达调用函数的功能。

  同时第一行中的第二个const 加了也无效,其约束的是一个由 char * p 转变为 char * const 的隐藏指针,该隐藏指针的指向值赋予给main 函数中的p,所以后者可以修改指向。(这时我的理解不确定正确与否)

 const char * const helpFun()
{
char * p =new char[];
p[]='a';
p[]='b';
p[]='\0';
return p;
} int main()
{
const char * p = helpFun();
p++;
cout<<p<<endl;
delete p;
return ;
}

  • 满足对const成员函数的调用

  这个结合例子说明比较容易,这里主要有一个原因是:const类型的对象,不能调用自身的非const成员函数,但是可以调用自己的const成员函数。例如下面的例子,b 声明为const A,12行是可以编译成功的,13行缺会错误,根本原因或许是内部 this 指针转换(不确定)。

 class A {
public:
A():num() { }
void setnum() { }
void getnum() const{ }
private:
int num;
};
int main()
{
const A b;
b.getnum();
b.setnum();///////////////////////错误
return ;
}

  基于上面的一个原因,下面例子便容易说明,A 类是B 类运算中产生的隐藏变量,为了调用A 类中的const 函数,B类生产A 类的函数返回类型需要加const。

 class A
{
public:
A():num(){}
void setnum(){ num = ; }
void getnum() const{
printf("%d\\n",num);
}
private:
int num;
}; class B
{
public:
const A* get()
{
A *p = new A();
return p;
}
}; int main()
{
B b;
b.get()->getnum();
b.get()->setnum();
return ;
}

  • const 成员函数的返回类型是引用时候,需要加const 约束
int fun() const;

int & fun() const;

  成员函数中上面是合法的,下面缺不合法,具体例子如下,对于第5行 函数返回类型中的const 不能省略,不管第10行是否有const,这应该是内部value 对象类型的转换,GetValue 函数中的value 被转换成了 const int(第10行没有const 也会转换),但return 的如果是 int & 类型便出现了  const int -> int & 这种类型转换,这是禁止的,所以返回引用时必须加const,总结来说,如果GetValue 是const函数且返回类型是引用,那么返回类型中的const 和16行的const 不能省略。

 class Test
{
public :
Test(int a):value(a){}
const int & GetValue()const
{
return value;
}
private:
const int value;
}; int main()
{
Test t();
const int &a = t.GetValue();
cout<<a<<endl;
return ;
}

  引申如果const 成员函数返回的值 指针呢?这与返回int 类型是一样是赋值给接受对象,而引用因为没有了复制所以必须有const,例如下面代码可以编译运行,同时发现绕开了类的private约束。第6行返回类型加const,其实便是第三种情况。如果第13行 是 const int * p,那么情况便不一样了,第6行和第19行都需要加const。

 class Test
{
public :
Test(int a):value(a){ p = &value; }
void setValue(){value =;}
int * GetValue()const
{
return p;
}
int getv(){return value;}
private:
int value;
int * p;
}; int main()
{
Test t();
int *a = t.GetValue();
cout<<*a<<endl;
*a = ;
cout<<t.getv()<<endl;
delete a;
return ;
}

参考资料:

http://www.docin.com/p-97354417.html

http://blog.chinaunix.net/uid-24922718-id-3480107.html

http://blog.sina.com.cn/s/blog_4366aa320100cknr.html

http://blog.csdn.net/zhjxin1800/article/details/7584375

http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html

c/c++: c++函数返回类型什么情况带const的更多相关文章

  1. vector作为函数返回类型

    在实际的操作中,我们经常会碰到需要返回一序列字符串或者一列数字的时候,以前会用到数组来保存这列的字符串或者数字,现在我们可以用vector来保存这些数据.但是当数据量很大的时候使用vector效率就比 ...

  2. MSSQLSERVER数据库- 字符串分割函数返回类型表

    遇到这样一个问题,存储在数据库的数据是一串字符串如:1,2,3,4,5,6.想把这串字符串进行转变成一个表格,如下: 1 2 3 4 5 6 就是这样一个问题,有人同事,写了一个这样的封装函数,这样就 ...

  3. Flask04 后台获取请求数据、视图函数返回类型、前台接受响应数据

    1 后台获取请求数据 1.1 提出问题 前台发送请求的方式有哪些 后台如何获取这些请求的参数 1.2 前台发送请求的方式 GET.POST.AJAX 点睛:如果不指定请求方式,浏览器默认使用GET请求 ...

  4. 有关Mysql的mysql_store_result函数返回NULL的情况以及其他注意事项

    成功调用mysql_query()后,mysql_store_result()能够返回NULL.出现该情况时,表明出现了下述条件之一: ·         出现了malloc()故障(例如,如果结果集 ...

  5. c++11: trailing return type in functions(函数返回类型后置)

    In C++03, the return type of a function template cannot be generalized if the return type relies on ...

  6. c++ 函数返回研究[转]

    一,c++函数的返回分为以下几种情况 1)主函数main的返回值:这里提及一点,返回0表示程序运行成功. 2)返回非引用类型:函数的返回值用于初始化在跳用函数出创建的临时对象.用函数返回值初始化临时对 ...

  7. C++ const修饰函数、函数参数、函数返回值

    const修饰函数 在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数.为什么不能调用非const函数?因为非const函数可能修改数据成员,cons ...

  8. oracle调用存储过程和函数返回结果集

    在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql server 里比较好处理,直接返回查询结果就可以了,但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得 ...

  9. C基础知识(5):指针--传递指针给函数&返回指针的函数

    下面从3个代码例子分别讲述以下2个知识点: (1) 传递指针给函数(参数类型为指针) (2) 返回指针的函数(返回类型为指针) #include <stdio.h> // 传递指针给函数& ...

随机推荐

  1. manjaro安装teamviewer后无法打开

    点桌面快捷方式一闪而过 命令行运行提示 $ teamviewer /opt/teamviewer/tv_bin/script/tvw_exec:行7: /opt/teamviewer/logfiles ...

  2. 笔记-python-元类metaclass

    笔记-python-元类metaclass 1.      元类 1.1.    类也是对象 class Person(object): pass 上面的代码会在内存中创建一个类,它也是对象, 可以将 ...

  3. [Python3.x]python3.5实现socket通讯(TCP)

    TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的 ...

  4. BZOJ [Poi2012]Fibonacci Representation

    找最近的数 记忆化 (我也不知道为什么对的) #include<cstdio> #include<algorithm> #include<map> using na ...

  5. 获取HTTP请求头中的地址

    技术交流群:233513714 public static String getIpAddr(HttpServletRequest request) { String ip = request.get ...

  6. DOS程序员手册(二)

    2.6存储设备     随着DOS的升级,磁盘存储容量也有了很大扩充.表2.4介绍了软盘容量的增加以     及所支持驱动器型号的数量.                                 ...

  7. USACO Section1.2 Milking Cows 解题报告

    milk2解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  8. jenkins调用pom.xml文件

    对于测试人员来说,大部分代码维护在本地,因此在用jenkins做持续集成时,我们只需要用Jenkins去直接调用pom.xml文件去执行我们的项目 这里主要是正对创建自由风格的工程来讲解的 一.Jen ...

  9. vue零碎收集

    在组件中创建dom: let a=document.querySelector('.test'); let newDom=document.createElement("div") ...

  10. 孤荷凌寒自学python那些事第二天

    孤荷凌寒自学python第二天 Python的变量声明 (完整学习过程屏幕记录视频在文末,手写笔记在文末) Python的变量声明不必要显式指定变量类型 甚至也不需要进行显式的声明 比javascri ...