首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++ - const成员/ return const int& vs return int

C++ - const成员/ return const int& vs return int
EN

Stack Overflow用户
提问于 2011-03-31 07:23:27
回答 5查看 6.8K关注 0票数 10

我们所说的C++行是什么意思?有没有其他的方法来写它们呢?

代码语言:javascript
运行
AI代码解释
复制
const int& a() const;
int getA() const;

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2011-03-31 07:26:19

这两个签名是承诺不更改对象本身的类中的成员函数的两个可能签名。在第一种情况下,它将返回一个对整数(可能是成员属性)的常量引用,引用为const意味着调用者将无法使用它来更改内部属性。第二种情况,它通过值返回一个整数。

在语义上有一些细微的差异,但在大多数情况下,它们并不重要,可以将它们视为获取值的两个函数。对于它将会有所不同的情况,请参阅以下内容:

代码语言:javascript
运行
AI代码解释
复制
class test {
public:
   test() : m_value() {
      std::cout << &m_value << std::endl; // print where the attribute is
   }
   int const & getValue() const {
      return m_value;
   }
   int copyValue() const {
      return m_value;
   }
   void setValue( int value ) {
      m_value = value;
   }
private:
   int m_value;
};
int main() {
   test t;                      // will printout an address [1]
   int v1 = t.getValue();       // caller copies the value
   int v2 = t.copyValue();      // caller copies the value (itself a copy in hte calle)
   int const &r = t.getValue(); // reference to t.m_value
   int const &c = t.copyValue();// reference to *copy* [2]
   std::cout << v1 << v2 << r << c
      << std::cout;             // 0000
   std::cout << &v1 << &v2      // 4 pointers, the third is [1] a r *is* t.m_value
      << &r << &c << std::cout; //     the rest should be different
   t.setValue( 5 );
   std::cout << v1 << v2 << r   // 0050, v1 and v2 where copies, r *is* t.m_value
      << c << std::cout;
}

标记为2的代码行使用了语言的一个奇怪特性,通过该特性,如果您获得一个对r值(临时)的常量引用,编译器将把该临时引用绑定到该引用,并使其保持活动状态,直到该引用超出范围为止(基本上它将r值临时变量转换为一个隐藏变量,并将该引用绑定到该变量)。

我添加了这一行是显式的,因为行为上的差异并不是由于接收端main制作了一个维护引用的副本,而是(准确地说)是由访问者的签名造成的。

票数 12
EN

Stack Overflow用户

发布于 2011-03-31 08:16:09

这两种方法都是实现相同目标的等价方法:

代码语言:javascript
运行
AI代码解释
复制
const int& a() const;
int getA() const;

您正在返回一个值。方法头部右侧的常量是一个注释,函数getA()和a()不会修改将执行它们的对象(隐藏的this参数)。这在编译时很重要,因为这意味着在编译时将考虑额外的验证。在运行时,上面的函数和这些函数没有区别:

代码语言:javascript
运行
AI代码解释
复制
const int& a();
int getA();

然而,扩展编译器的验证功能的巨大好处(当您不期望它发生时,不会有任何改变)显然值得额外的const

第二部分要担心的是这两个函数的返回类型,这代表了它们之间的主要区别,也可能是这个问题的动机。让我们将主题更改为不同的函数:

代码语言:javascript
运行
AI代码解释
复制
std::string getName() const;
   { return name; }

在这里,返回值可能是来自类的name属性。返回是通过值进行的,这意味着从该方法返回时将创建属性的副本。当字符串很大,并且您要在应用程序中按值移动大量字符串时,这可能是一个问题。然后,它恰好出现了按引用返回的机制,该机制承诺不复制:

代码语言:javascript
运行
AI代码解释
复制
std::string &getName() const
   { return name; }

这实际上非常有趣:我们返回一个引用,而不是对象的副本。引用类似于指针,因此您只需复制一个指针( 32位系统中为4个字节),而不是整个对象。这是很有希望的。但是,它甚至不会编译。编译器会抱怨你返回了一个引用,而你承诺的方法是const,因此,它将执行的对象不应该被修改。此代码将允许发生非法操作:

代码语言:javascript
运行
AI代码解释
复制
Person p( "Baltasar" );
p.getName() = "José";

cout << p.getName() << endl;

这就是为什么返回类型的const作为一个新的有吸引力的选项出现,它将解决这个问题。常量引用不允许修改它所指向的对象,使用:

代码语言:javascript
运行
AI代码解释
复制
const std::string &getName() const
    { return name; }

它现在可以编译了,而之前的恶意代码不能。现在让我们回到我们的问题上:

代码语言:javascript
运行
AI代码解释
复制
const int &getA() const;
int a() const;

第二个是按值返回,这意味着将在返回时复制int (4字节)。第一个表示将返回对int (4字节)的常量引用。可以看出,在这种情况下,使用按引用返回而不是按值返回对性能没有任何好处。

根据经验,按常量引用返回总是安全的,它永远不会比按值返回更昂贵。

票数 6
EN

Stack Overflow用户

发布于 2011-03-31 07:27:08

代码语言:javascript
运行
AI代码解释
复制
const int& a() const;

a()返回对int的常量引用。末尾的const修饰符表示它不能更改在其上调用的对象的状态。

代码语言:javascript
运行
AI代码解释
复制
int getA() const;

除了返回类型是int之外,与上面的描述相同,如果收集了返回变量的副本,则该类型涉及到该变量的副本。

说不能改变对象的状态是什么意思?

代码语言:javascript
运行
AI代码解释
复制
class foo
{
    int m_Var ;
    public:
        foo(int arg1) : m_Var(arg1){}
        void mutableMethod()
        {
            m_Var = 20 ;  // "this" has the variable m_Var and
                          //  by assigning it a value changes the state of
                          //  m_Var. Changing the state of it's member variable
                          //  is meant changing the state of object.
        }

        void nonMutableMethod() const
        {
             m_Var = 20 ;  //  This assignment is not allowed because of const 
                           //  modifier. The method is not allowed to change the
                           //  the state of object on which it is called ( this )
        }
};

此外,常量方法不能通过非常数引用返回成员变量。

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

https://stackoverflow.com/questions/5496491

复制
相关文章
【C++】const对象和const成员
如果我们在定义一个对象之后,不希望在后面对这个对象进行修改,那么我们可以把这个对象声明为const对象。 声明为const对象之后,这个对象的所有数据成员后面都不能被修改!
谙忆
2021/01/21
1.2K0
C++中const和非const对象分别调用const和非const成员函数
我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中
早起的鸟儿有虫吃
2023/03/21
1.4K0
C++中const和非const对象分别调用const和非const成员函数
C++之const成员函数
由于const函数的隐藏参数this指针变成了const 类名*this,所以const函数不能修改类的数据成员的值,但可以使用类的数据成员。
zy010101
2020/04/08
9300
c++之const修饰成员函数
常函数: 成员函数后加const后我们称这个函数为常函数; 常函数不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const 常对象只能调用常函数 常函数: #include<iostream> using namespace std; class Person { public: int age; mutable int tmp;//用mutable修饰的为特殊变量,可以在常量函数中修改 void showPerson()
西西嘛呦
2020/08/26
6540
C++中的const成员变量和成员函数
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。
芯动大师
2023/10/14
3500
C++中的const成员变量和成员函数
static const VS #define VS enum
问题 在 C 语言中,下面的用法哪个最好? static const int var = 5; #define var 5 enum { var = 5 }; 回答 取决于你用来干什么。 static const int var = 5 #define var 5 enum { var = 5 } 如果需要传指针,那只能用 (1) (1) 不能作为全局作用域下数组的维数定义,而 (2)(3) 可以 (1) 不能作为函数作用域下静态数组的维数定义,而 (2)(3) 可以 (1) 不能在 switch 语句下使
ClearSeve
2022/02/11
7550
double &operator[](int i)与 double operator[](int i)const区别
而返回类型处加&,是为了直接返回对象本身,在这个例子中,通过返回double &可以使函数做左值。
Twcat_tree
2022/11/30
5700
怎么理解int main(int argc, const char *argv[])
每次创建一个程序总会看到已经编写好的Hello World程序(如下代码 0-1):
莫斯
2020/09/09
2K0
C++之const
C语言中的const const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在只读存储区分配空间 const 只在编译期有用,在运行期无用 const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边 C语言中的const使得变量具有只读属性 const将具有全局生命周期的变量存储于只读存储区 const 不能定义真正意义上常量 #include<stdio.h> int main() { const int c = 0
程序手艺人
2018/05/18
9180
C++ 顶层 const
本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面
全栈程序员站长
2021/12/03
2810
C++ const详解
常量在C++中经常用到,用关键字const表示,它是常数变量,也就是说,它仍然是变量,而不是常数。什么区别呢?编译器会为变量在内存中分配地址空间,而常数是编译器在编译过程中记录在内存表里一个实体。
猫叔Rex
2020/06/29
6550
1.C和C++区别,以及const分析(底层const/顶层const)
int f() int f(void)表示都一样,没有参数,返回值为int型的函数
诺谦
2019/05/24
8870
Javascript中的Return,Return false和Return true
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/52928626
Tyan
2019/05/25
2.3K0
C++中const小结
1、const修饰普通变量(非指针变量) const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 对于一个非指针的类型TYPE,这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是只读的。 2、const修饰指针变量 通用的准则: 在没有括号的情况下: 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
用户1215536
2018/02/05
5720
C++中const与C中的const使用对比
大家好晚上好,今天给大家分享的是,c++中的const的使用,在我们以前学习c语言的时候,我们已经接触了const的用法,那么在c++中,const的使用,又会有什么样的不同呢?接下来就开始我们的分享吧!每天进步一点点,日积月累你也是专家!
用户6280468
2022/03/21
6560
C++中const与C中的const使用对比
C++ const常量对象、常量成员函数和常引用
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const 关键字。
小林coding
2020/03/31
1.4K0
C++随笔(0)——关于const
上面这样就可以将bufSize定义为常量,编译的时候编译器会把用到该变量的地方都替换成对应的值。在代码运行过程中无法为常量另外赋值:
太阳影的社区
2021/10/15
3560
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 ,
韩曙亮
2023/10/15
2380
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
const修饰类中成员变量及函数
const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。
我与梦想有个约会
2023/10/20
2790
C++使用非常量静态成员(non-const static data member)
非常量静态成员的错误使用方法 静态成员只跟类有关,是所有对象共有的属性,如果在类中初始化则意味着每个对象都初始化一次,这样就需要非静态成员了。非常量静态成员函数不可以在类中初始化,一定要在类外把类名作为命名空间而初始化,但放在private里又只能在类里初始化,这种操作是无法实现的。但C++支持在类里定义非常量静态成员函数,如"static double average(){...};"。 误区二:在函数体内对非常量静态成员变量初始化。(xcode有提示)正确的方法是将初始化语句放到函数体外定义(在类中只有声明),然后在函数内以class::member的方式调用。
gojam
2019/05/14
6.5K0

相似问题

将double分配给const int& vs int到const int&

53

Int& to const int -static vs dynamic-

36

关于func(const int&)和func(const int)

17

const T* search ( const T &) return not working

11

"const int& jj“和"int& const jj”有什么区别?

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文