初始化引用成员必须用初始化列表,这个也是唯一方式?

sese53 2009-01-14 05:57:37
C++语法确实比较烦人,请问一下大家这个是为什么?
为什么不能在构造函数里面赋值?引用是能够充当lvalue(左值)的啊

实例代码《C++经典入门》
TruckLoad& rLoad;
/*****类中的一个实例域****

BoxPtr::BoxPtr(TruckLoad& load) : rLoad(load){}

为什么必须要向这样赋值呢。这样不行么
BoxPtr::BoxPtr(TruckLoad& load)
{
rLoad = load;
}
...全文
704 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
papaofdoudou 2009-05-27
  • 打赏
  • 举报
回复
mark
sese53 2009-01-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lbh2001 的回复:]
赋值只能对可修改的左值进行操作,不能对不可修改的左值操作

初始化则弥补了这个缺陷,不可修改的左值只能通过初始化来赋初值

赋值运算符(注意,不是“赋值构造函数”)和拷贝构造函数都是用已有的对象来创建另一个对象。
不同之处在于:拷贝构造函数是生成一个全新的对象,即
A a(b); //这才是C++风格的初始化
A a = b;//注意,这种风格只是为了与C兼容 还是调用拷贝构造
//为什么不调用赋值=,这是因…
[/Quote]

你第一句话以外的,我倒是了解,但是还是有这个问题。
class A
{
public:
A(i): m_i(i){}
int m_i;
};

A obj = 3;
结果是调用的一般构造函数,这个我不能理解。能不能帮忙解决一下。
superyys 2009-01-15
  • 打赏
  • 举报
回复
这个问题的根本原因是C++的引用一定要初始化.
在不是类里面,你申明一个int &i;都是错误的,在类里虽然可以这样申明,但也一定要初始化,
C++规定对类成员进行初始化的唯一方式就是在构造函数后面跟:data(参数)
所以你只要提供一个构造函数对引用成员进行初始化,第二个构造函数是可以对引用成员进行赋值的!
请看.

class DCF
{
public:

DCF(int &i):l(i) //假如这里没有:l(i),肯定编译不过,因为引用成员没有初始化.
{
l=i;
}

DCF dd(int ddd,int &i)
{
l=i; //这里可以赋值
}
private:
int &l;
int j;
};
lbh2001 2009-01-15
  • 打赏
  • 举报
回复
赋值只能对可修改的左值进行操作,不能对不可修改的左值操作

初始化则弥补了这个缺陷,不可修改的左值只能通过初始化来赋初值

赋值运算符(注意,不是“赋值构造函数”)和拷贝构造函数都是用已有的对象来创建另一个对象。
不同之处在于:拷贝构造函数是生成一个全新的对象,即
A a(b); //这才是C++风格的初始化
A a = b;//注意,这种风格只是为了与C兼容 还是调用拷贝构造
//为什么不调用赋值=,这是因为这里的“=”不是运算符。它只是一种形式上规定的分隔符。

在这之前a对象是不存在的,或者说还没有构造好。

赋值构造函数operator=()是两个对象都已经构造好的情况下使用的。即
a = b;
的时候,a和b都已经初始化过了(这里的“初始化过”包括默认的构造函数初始化)。

A a(b); 等同 A a = b; -------->调用拷贝构造函数创建对象a
A a;
a = b; -------->调用赋值构造函数改变对象a

lann64 2009-01-15
  • 打赏
  • 举报
回复
因为引用跟指针不一样,引用在定义后是不能修改指向的,所以得在它初始化时绑定它的指向。
waizqfor 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sese53 的回复:]
我好像有点懂了。一个调用的是复制构造函数,一个是赋值运算符重载?
[/Quote]
可以怎么理解
feng4206yu 2009-01-14
  • 打赏
  • 举报
回复
初始化列表方式还适用于子类对继承来的父类变量的初始化,如果父类的构造函数比较特殊..
nineforever 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sese53 的回复:]
我好像有点懂了。一个调用的是复制构造函数,一个是赋值运算符重载?
[/Quote]

是的,一个类似于调用拷贝构造,一个类似于调用赋值操作符。
sese53 2009-01-14
  • 打赏
  • 举报
回复
我好像有点懂了。一个调用的是复制构造函数,一个是赋值运算符重载?
sese53 2009-01-14
  • 打赏
  • 举报
回复
我的问题是你不对它进行初始化,应该就是一些乱的值吧。
sese53 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyisnail 的回复:]
BoxPtr::BoxPtr(TruckLoad& load) : rLoad(load){}//必须这样初始化

为什么必须要向这样赋值呢。这样不行么
BoxPtr::BoxPtr(TruckLoad& load)
{
rLoad = load;//因为这样是赋值,而不是初始化,引用必须初始化
}
[/Quote]

赋值和初始化有何区别呢?能不能简单说说。
waizqfor 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 sese53 的帖子:]
C++语法确实比较烦人,请问一下大家这个是为什么?
为什么不能在构造函数里面赋值?引用是能够充当lvalue(左值)的啊。

实例代码《C++经典入门》
TruckLoad& rLoad;
/*****类中的一个实例域****

BoxPtr::BoxPtr(TruckLoad& load) : rLoad(load){}

为什么必须要向这样赋值呢。这样不行么
BoxPtr::BoxPtr(TruckLoad& load)
{
rLoad = load;
}
[/Quote]
rLoad(load){};这是语法格式要求 很难说明为什么
rLoad = load;放里面就算赋值了
声明变量和给变量赋值的道理
xiaoyisnail 2009-01-14
  • 打赏
  • 举报
回复
楼主首先需要了解c++里初始化和赋值的区别
xiaoyisnail 2009-01-14
  • 打赏
  • 举报
回复
BoxPtr::BoxPtr(TruckLoad& load) : rLoad(load){}//必须这样初始化

为什么必须要向这样赋值呢。这样不行么
BoxPtr::BoxPtr(TruckLoad& load)
{
rLoad = load;//因为这样是赋值,而不是初始化,引用必须初始化
}
lightnut 2009-01-14
  • 打赏
  • 举报
回复
没有别法!
内容概要:本文聚焦于“通过ADMM进行TV-L1去噪”的研究,系统阐述了基于交替方向乘子法(ADMM)实现总变差(Total Variation, TV)正则化与L1范数稀疏约束相结合的图像去噪模型。文中详细解析了TV-L1模型的数学构建及其在抑制椒盐噪声、保持图像边缘结构方面的优越性,重点介绍了ADMM算法如何将复杂的凸优化问题分解为多个可高效求解的子问题,提升收敛效率与数值稳定性。配套提供的Matlab代码实现了完整的去噪流程,便于读者复现算法并开展实验验证。此外,文档还整合了电力系统、信号处理、路径规划、机器学习等多个领域的科研资源,凸显其作为综合性学术资料包的价值。; 适合人群:具备良好数学基础与Matlab编程能力,从事图像处理、信号去噪、优化算法或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入理解并复现基于ADMM的TV-L1图像去噪算法;② 掌握总变差正则化与L1范数在稀疏噪声去除中的理论与应用;③ 利用所提供的Matlab代码进行算法调试、性能评估与二次开发;④ 借助附带的多领域科研案例拓展研究思路,推动跨学科技术创新。; 阅读建议:建议读者结合理论推导与Matlab代码实践,逐步跟踪ADMM的迭代过程,观察其收敛行为与去噪效果,同时可参考文档末尾提供的丰富科研资源链接,拓展技术视野与研究深度。

65,211

社区成员

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

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