首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >了解常量引用对非成本数据成员的赋值

了解常量引用对非成本数据成员的赋值
EN

Stack Overflow用户
提问于 2017-01-05 07:42:38
回答 3查看 144关注 0票数 2

我正在审查C++参考文献,我试图推断为什么下面这段代码符合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>

class Foo {

public:

    Foo(const std::string& label)
        : d_label(label) {}

private:

    std::string d_label;

};

int main(int argc, const char** argv) {
    Foo("test");
    return 0;
}

这里,我们将一个常量字符串的引用赋值给一个字符串。在这样做的时候,是否制作了一个非常数的label副本?如果是这样的话,为什么我们可以复制一个const对象本身就是非常量呢?否则,在复制构造函数/赋值调用方面,这里到底发生了什么?

EN

回答 3

Stack Overflow用户

发布于 2017-01-05 08:53:08

在C++中,关键字const实际上表示只读。要制作对象的副本,您不需要写访问权限。因此,您可以将const std::string复制到std::string中。

还要注意,在C++中复制意味着在默认情况下进行深度复制。这就是所谓的值语义。因此,操作复制的字符串不会对原始字符串做任何操作。

现在来看你的最后一个问题:下面这行是怎么回事?

测试Foo(“

”);

"test"的类型为const char[5]。编译器搜索匹配的Foo构造函数。由于"test"可以隐式转换为std::string,因此

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
basic_string<CharT,Alloc>::basic_string( const CharT * s, const Alloc & a = Alloc() );

构造函数时,将执行此转换,即从"test"构造一个临时std::string。然后将对此临时函数的常量引用传递给构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Foo::Foo( const std::string & label );

此构造函数依次调用std::string的复制构造函数,以构造Food_label成员

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
basic_string<CharT,Alloc>::basic_string( const basic_string & other );
票数 3
EN

Stack Overflow用户

发布于 2017-01-05 07:47:48

这里没有发生任何任务。d_label(label)label初始化变量d_label,随后调用string类型的。

让我们仔细看看:

  • Foo("test");使用其类型为const char[5]
  • Here的const std::string& label初始化"test",字符串引用(label)正被初始化为具有const char[5]类型的值。此初始化是有效的,因为可以将通过decayingconst char *"test"传递给其中一个获得const char *.
  • Now的string构造函数。label是对存储label.
  • At的实数字符串对象的引用。Foo::d_label使用string引用的对象初始化string类型的点复制构造函数,并构造
票数 1
EN

Stack Overflow用户

发布于 2017-01-05 08:07:38

C++同时提供了引用语义和值语义:对象具有值,然后您可以引用对象。

std::string d_label

d_label是一个包含字符串值的对象。它被认为拥有将字符串作为内存资源保存的字节。这种所有权概念使使用d_label作为修改字符串的接口变得更加合理。

常量标准::字符串和标签

label是对字符串的只读引用。这与“对const字符串的引用”并不完全相同。它引用的对象可能不是(也可能不是) const

标签:d_label(

)

这将使用复制构造函数使用label的内容初始化d_label。然后,您可以随心所欲地处理副本。您知道,复制过程不会修改label的底层对象,因为label被声明为const &

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41479663

复制
相关文章
C++ const常量对象、常量成员函数和常引用
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const 关键字。
小林coding
2020/03/31
1.4K0
C++对象成员的引用 | 对象成员引用
C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public成员,而不能访问 private成员。
小林C语言
2021/01/21
2.1K0
C++对象成员的引用 | 对象成员引用
你对常量池够了解吗
是class文件中的资源仓库。我们的 class 文件,用十六进制编辑器( notepad++ 安装 Hex-editor )打开,可以发现它第二行的内容是这样的:
贪挽懒月
2021/11/29
2950
你对常量池够了解吗
【ThinkingInC++】61、非成员运算符「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116716.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/06
1460
Python的赋值和引用
以某
2023/03/07
2K0
Python的赋值和引用
【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
C++ 对 C 扩充 : 引用 ( Reference ) 概念 , 是 C++ 在 C 的基础上进行的扩充 , 在 C 语言中是没有引用的 ;
韩曙亮
2023/03/27
1.2K0
【C++】C++ 引用详解 ⑧ ( 普通引用与常量引用 | 常量引用概念与语法 )
之前的 【C++】C++ 引用详解 ① ~ ⑦ 博客中 , 讲解的都是 普通引用 , 也就是 将 普通变量 赋值给 引用 , 过程如下 : 先定义 普通变量 a , 然后定义 已存在变量 a 的引用 b ;
韩曙亮
2023/10/15
3990
【C++】C++ 引用详解 ⑧ ( 普通引用与常量引用 | 常量引用概念与语法 )
c++面向对象设计(谭浩强) 2.4对象成员的引用
2.4.1 通过对象名和成员运算符访问对象中的成员 stud1.num=1001; 对象名.成员名 访问的是public中的 2.4.2 通过指向对象的指针访问对象中的成员 p->hour (*p).hour t,hour 2.4.3通过对对象的引用 Time t1; Time &t2=t1; cout << t2.hour;
xxxflower
2023/04/16
5440
C++_const 常量成员以及成员初始化列表及其常量类
常量成员,指的是在C++类中声明对象成员时可以加上const关键字,这样声明的成员叫常量成员, 常量成员分为常量数据成员和常量函数成员
木杉乀
2021/05/08
1K0
【笔记】《C++Primer》—— 第14章:重载运算和类型转换
这一章介绍了对运算符的重载和类型转换,其中最重要的是对各种运算符的运用,14.8对function类的运用和14.9对类型转换时可能产生的二义性的理解,其余的内容不多,这篇看起来很多节但其实只是因为内容比较散而已。
ZifengHuang
2020/07/29
6680
【笔记】《C++Primer》—— 第14章:重载运算和类型转换
《C++Primer》第十四章 重载运算与类型转换
我们定义重载的运算符时,必须首先决定它是声明为类的成员函数还是声明为一个普通的非成员函数:
TOMOCAT
2020/11/24
9300
类成员的初始化与赋值
首先,我们来普及一个尽人皆知的简单事实:如果一个变量在定义的时候未被初始化,那么它的值会根据具体的存储位置或被处理成0,或被处理成随机值。
用户2617681
2019/08/08
1.1K0
类成员的初始化与赋值
【说站】javascript引用类型的赋值
1、引用类型的赋值实际上是对象保存在栈区地址指针上的授权值,因此两个变量指向同一个对象,任何操作都会相互影响。
很酷的站长
2022/11/23
7440
关于引用变量赋值问题
* 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
李才哥
2020/03/28
2.1K0
关于引用变量赋值问题
《Effective C++》学习笔记
对于单纯常量,尽量以const对象或enums枚举来代替#define。 对于函数宏,用inline函数代替#define(define是死板的替换,容易产生传递计算式类似累加多次的问题)
Cloudox
2021/11/23
1.1K0
const成员函数一定是线程安全的吗?
//这个概念是为了实现限制成员函数仅仅用于左值或右值,带有引用修饰词的成员函数,不必是虚函数
用户9831583
2022/12/04
1.1K0
const成员函数一定是线程安全的吗?
非常量的引用左值问题
今日,我在写数据结构作业时,编写的程序中出现了这样一段报错,有点懵的我遍历四方博客终于发现了问题所在
glm233
2020/09/28
1.1K0
C/C++面试常问题集(2)
C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。
_咯噔_
2022/03/04
1.2K0
C++:09---类静态成员、类常量成员
一、类静态成员(static) 先介绍一下什么是静态变量、静态函数 静态局部变量:存在域(全局数据区),作用域(块作用域) 静态全局变量:存在域(全局数据区),作用域(整个文件) 静态函数:存在域(全局数据区),作用域(整个文件) static int a=10;//全局静态变量 static void add();//静态函数 int main() { { static int b=10;//局部静态变量 } } 特点: 静态static修饰的变量、函数,只需要初始化一
用户3479834
2021/02/03
1.6K0
C++:09---类静态成员、类常量成员
【C++】C++ 引用详解 ⑩ ( 常量引用案例 )
借助 常量引用 , 可以将一个变量引用 作为实参 传递给一个函数形参 , 同时保证该值不会在函数内部被修改 ; 这样既保证了参数传递效率 , 有保证了数据安全 ;
韩曙亮
2023/10/15
2670
【C++】C++ 引用详解 ⑩ ( 常量引用案例 )

相似问题

使非成员函数成为常量

42

对临时对象成员的常量引用

437

非成员函数可以返回常量值吗?

21

Constexpr非成员函数和引用Argos

20

使用模板减少常量和非常量非成员函数的代码重复

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文