• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c++中临时变量不能作为非const的引用参数的方法

c++中临时变量不能作为非const的引用参数的方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ const,c++ const用法,c++中const是什么意思,c++中const的用法,c++ const函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

试看下面的代码:

#include <iostream>
using namespace std;

void f(int &a)

 {
 cout << "f(" << a << ") is being called" << endl;
}

void g(const int &a)

{
 cout << "g(" << a << ") is being called" << endl;
}

 int main()

 {
 int a = 3, b = 4;
 f(a + b); //编译错误,把临时变量作为非const的引用参数传递了
 g(a + b); //OK,把临时变量作为const&传递是允许的
}
</div>

上面的两个调用之前,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,所以产生以下编译错误:

const_ref.cpp: In function `int main()':
const_ref.cpp:14: error: invalid initialization of non-const reference of type '
  int&' from a temporary of type 'int'
const_ref.cpp:4: error: in passing argument 1 of `void f(int&)' 而在g(a+b)中,由于g定义的参数是const int&,编译通过。  问题是为什么临时变量作为引用参数传递时,必须是常量引用呢?很多人对此的解释是临时变量是常量,不允许赋值,改动,所以当作为非常量引用传递时,编译器就会报错。这个解释在关于理解临时变量不能作为非const引用参数这个问题上是可以的,但不够准确。事实上,临时变量是可以被作为左值(LValue)并被赋值的,请看下面的代码:
#include  <iostream> 
using namespace std;

class CComplex {  
friend CComplex operator+(const CComplex &cp1, const CComplex &cp2);
friend ostream& operator<<(ostream &os, const CComplex &cp);
private: 
 int x; 
public: 
 CComplex(){}
  
 CComplex(int x1) { 
 x = x1; 
 }
};
 
CComplex operator+(const CComplex &cp1, const CComplex &cp2)

{ 
 CComplex cp3; 
 cp3.x = cp1.x + cp2.x; 
 return cp3; 
} ostream& operator<<(ostream &os, const CComplex &cp)

{
 os << cp.x;
 return os;
}

int main()

{ 
 CComplex a(2), b(3), c(4); 
 cout << (a + b) << endl;
 cout << ((a + b) = c) << endl;  //临时对象作为左值
 return 0; 
}
</div>

上面的程序编译通过,而且运行结果是:

5
4

临时变量确实被赋值,而且成功了。

所以,临时变量不能作为非const引用参数,不是因为他是常量,而是因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。

还不明白?OK,我们说直白一点,如果你把临时变量作为非const引用参数传递,一方面,在函数申明中,使用非常量型的引用告诉编译器你需要得到函数对某个对象的修改结果,可是你自己又不给变量起名字,直接丢弃了函数的修改结果,编译器只能说:“大哥,你这是干啥呢,告诉我把结果给你,等我把结果给你了,你又直接给扔了,你这不是在玩我呢吗?”所以编译器一怒之下就不让过了。这下大家明白了吧?

以上这篇c++中临时变量不能作为非const的引用参数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++中的const的使用详解
  • C++ const引用、临时变量 引用参数详解
  • c++中临时变量不能作为非const的引用参数的方法
  • c++ 类中const成员变量的赋值方法
  • C++中const应放在类型前还是后
  • C++中const用法小结
  • C和C++ const的声明差异
  • C++ 中const和复合类型
  • 解析C++编程中的bad_cast异常
  • C++ 中const 类型限定符不兼容问题

相关文章

  • 2017-05-28libevent库的使用--定时器的使用实例
  • 2017-05-28浅析内存对齐与ANSI C中struct型数据的内存布局
  • 2017-05-28用C语言程序判断大小端模式
  • 2017-05-28学习C++编程的必备软件
  • 2017-05-28c++获取sqlite3数据库表中所有字段的方法小结
  • 2017-08-27POJ2151 Check the difficulty of problems 概率DP
  • 2017-05-28浅谈C++函数声明后面加throw()的作用(必看)
  • 2017-05-28数组循环移位操作实例
  • 2017-05-28C++ 基础编程之十进制转换为任意进制及操作符重载
  • 2017-05-28希尔排序算法的C语言实现示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 使用opencv把图片拼接成视频
    • Codeforces 842A. Kirill And The Game (暴力算法比较)
    • C语言中结构体struct编写的一些要点解析
    • C++中的常对象与常对象成员详解
    • C/C++中宏定义(#define)
    • C++ explicit构造函数实例解析
    • C++多线程编程简单实例
    • C++ Vector用法深入剖析
    • C语言数据结构实现链表逆序并输出
    • 学编程难吗?多久能入门?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有