关于函数中引用参数的一个问题

zhouxqwh 2008-08-18 09:48:04
遇见一个C++类的定义如下。

但有一点不明白的是,对于其中的构造函数,引用类型不是不可以用“字面值常量”来初始化的吗?这里怎么可以?

class book_base
{
public:
book_base(const string &book = " ", double price_sale = 0):
isbn(book),price(price_sale){}
virtual void print_price()
{
cout<<price<<endl;
}
private:
string isbn;
double price;
};
...全文
85 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shtianhai 2008-08-18
  • 打赏
  • 举报
回复
楼上天才,UP,引用也是占内存滴!
daiguoliangfirst 2008-08-18
  • 打赏
  • 举报
回复
2楼太详细了。。
iwong 2008-08-18
  • 打赏
  • 举报
回复
const int& a = 0; // 这样写是可以的
int& b = 0; // 这样是不行的

字面值常量 0 是 const int 类型的
K行天下 2008-08-18
  • 打赏
  • 举报
回复
const引用可以
http://blog.csdn.net/k2eats/archive/2008/06/12/2541790.aspx

(3)const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如

double dval = 3.14159;

//下3行仅对const引用才是合法的

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。

引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。

例如:

double dval = 23;

const int &ri = dval;

编译器将其转换为:

int tmp = dval; // double -> int

const int &ri = tmp;

同理:上面代码

double dval = 3.14159;

//下3行仅对const引用才是合法的

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

内部转化为:

double dval = 3.14159;

//不可寻址,文字常量

int tmp1 = 1024;

const int &ir = tmp1;

//不同类型

int tmp2 = dval;//double -> int

const int &ir2 = tmp2;

//另一种情况,不可寻址

double tmp3 = dval + 1.0;

const double &dr = tmp3;

(4) 不允许非const引用指向需要临时对象的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!

int iv = 100;

int *&pir = &iv;//错误,非const引用对需要临时对象的引用

int *const &pir = &iv;//ok


const int ival = 1024;

int *&pi_ref = &ival; //错误,非const引用是非法的

const int *&pi_ref = &ival; //错误,需要临时变量,且引用的是指针,而pi_ref是一个非常量指针

const int * const &pi_ref = &ival; //正确

//补充

const int *p = &ival;

const int *&pi_ref = p; //正确
  • 打赏
  • 举报
回复
const的和非const的区别很大

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧