首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

const成员函数的语义是什么?

const 成员函数的语义是在编译时为函数提供常量绑定,表示函数返回值的值是不可变的。这意味着如果您尝试对函数进行重新赋值,则会产生编译时错误。例如,如果您的代码中存在以下声明:

代码语言:c++
复制
const int getValue() {

    // ...

};

则不能在函数内部尝试修改返回值的值,例如:

代码语言:c++
复制
getValue() = 42;

这将导致编译时错误。相反,如果您想要将返回值与常量相关联,可以像这样声明函数:

代码语言:c++
复制
const int getValue() {

    return 42;

};

然后,您可以使用 const 限定词来防止对该函数的重新赋值:

代码语言:cpp
复制
const int value = getValue();

这将创建一个常量变量,而不是尝试修改函数内部的返回值。注意,“const”不是数据类型,而是应用于指向 int 类型的指针或引用的一个修饰符,表示返回值不能被赋值为其它变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中const成员变量和成员函数

const成员函数(常成员函数const 成员函数可以使用类中所有成员变量,但是不能修改它们值,这种措施主要还是为了保护数据而设置const 成员函数也称为常成员函数。...我们通常将 get 函数设置为常成员函数。读取成员变量函数名字通常以get开头,后跟成员变量名字,所以通常将它们称为 get 函数。...,所以我们加了 const 限制,这是一种保险做法,同时也使得语义更加明显。...需要强调是,必须在成员函数声明和定义处同时加上 const 关键字。...函数头部结尾加上 const 表示常成员函数,这种函数只能读取成员变量值,而不能修改成员变量值,例如char * getname() const

21530

c++之const修饰成员函数

函数成员函数后加const后我们称这个函数为常函数; 常函数不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const 常对象只能调用常函数...;//用mutable修饰为特殊变量,可以在常量函数中修改 void showPerson() const{ //this指针本质是指针常量,指针指向是不可以修改...this = NULL; //即Person* const this; //在函数后面加了const之后,变成const Person* const this...,可以在常量函数中修改 void showPerson() const{ cout << "这是常函数" << endl; } }; void test() {...const Person p;//在对象前加const,变为常对象 //常对象不能调用普通成员变量 p.age = 10; //特殊变量,在常对象下也可以修改 p.tmp

63310

C++中const和非const对象分别调用const和非const成员函数

一、先来提出问题 const对象可以调用非const成员函数吗? 非const对象可以调用const成员函数吗? const成员函数内可以调用其它const成员函数吗?...非const成员函数内可以调用其他const成员函数吗?...二、实践出真知 1、const对象可以调用const成员函数 2、const对象不能调用非const成员函数 3、非const对象可以调用const成员函数 4、非const对象可以调用非const成员函数...5、const成员函数不能调用非const成员函数 6、非const成员函数可以调用非const成员函数 我们知道c++在类成员函数中还会隐式传入一个指向当前对象this指针,所以在test类中,...* this; 是和void print() const;中this指针类型是一样,所以常量对象可以调用const成员函数

1.2K20

const修饰类中成员变量及函数

const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部一些属性不被轻易修改。以保证数据完整性。下面分别介绍const修饰成员变量和成员函数。...const修饰成员变量表示成员常量,只能在初始化列表中赋值,可以被const和非const成员函数调用,但不能修改其值。...= 300; } ~CConst(void); private: // const 成员变量 const int iValue; }; const修饰成员函数目的是不让函数修改类内部数据成员,而且不会调用其他非...const成员函数(如果调用则编译出错) #include using namespace std; class CConst { public: // 在初始化列表初始化const成员函数...CConst(void):x(200), y(300){} // const 成员函数const修饰符只能在函数名后面 void display() const { // 不能调用非const函数

21820

const成员函数一定是线程安全吗?

容易多了 //容器成员函数 cbegin和 cend都返回 const_iterator型别,甚至对于非 const 容器也是如此 //并且需要记住:STL一些成员函数取用指示位置迭代器,例如插入.../** 如果C对应一个传统容器型别 std::vector则container就是该型别的引用到 const 版本,const std::vector&,调用 C++11 提供成员函数版本 begin...和成员函数是否带有 const声明是一样。...//宗旨:多个线程同时调用带有 const成员函数,如何保证线程安全性 //const成员函数就一定是线程安全吗?...成员函数意味着只读,多个线程在没有同步条件下执行读操作是安全 //但是,本案例并不安全,roots()虽然是const成员函数,但是企图改变两个 mutable成员变量值 //方法一:保证 const

1.1K20

【C++】C++ 类中 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析 在 C++ 类中 , 普通非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 类中 , 定义了 void fun(int...age, int height) 成员函数 , 下面使用 const 关键字修饰该类 ; 使用 const 修饰 成员函数 , 写法如下 , 在 fun() 之后使用 const 关键字修饰 函数 :...在 * 右边修饰是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 类成员函数 // const 关键字可以 // 在 void...const int age; // 年龄 const int height; // 身高 如果 成员函数const 关键字 声明为 常量成员函数 , 则在该函数中 不能修改 类对象中 任何成员变量..." << endl; } ~Student() { cout << "执行 Student 析构函数" << endl; } // 使用 const 修饰 类成员函数 // const

18820

【C++类和对象】const成员函数及流插入提取

使用const修饰成员函数不能修改类成员变量,也不能调用非const成员函数。...注意: const成员函数内不可以调用其它const成员函数const成员函数内是不允许调用非const成员函数。因为const成员函数被声明为const,它承诺了不会修改类成员变量。...如果在const成员函数内部调用非const成员函数,那么就可能会导致成员变量被修改,违反了const成员函数约定。...非const成员函数内可以调用其它const成员函数const成员函数内可以调用其他const成员函数。...const成员函数表示该函数不会修改类成员变量,因此在非const成员函数内调用const成员函数是安全

10410

C++ const常量对象、常量成员函数和常引用

— 1 — 常量对象 如果不希望某个对象值被改变,则定义该对象时候可以在前面加 const 关键字。...--- — 2 — 常量成员函数 在类成员函数后面可以加 const 关键字,则该成员函数成为常量成员函数。...这里有两个需要注意点: 在常量成员函数中不能修改成员变量值(静态成员变量除外); 也不能调用同类 非 常量成员函数(静态成员函数除外)。...常量成员函数 int GetValue() { return 2*m_value; } // 普通成员函数 int m_value; }; int main() { const...可以用对象常引用作为参数,如: class Sample { ... }; void Func(const Sample & o) // 对象常引用作为参数 { ... } 这样函数中就能确保不会出现无意中更改

1.4K20

C++类成员函数 | 成员函数

C++成员函数性质 在C++中,类成员函数函数一种,它有返回值和函数类型,它与一般函数区别只是:  属于一个类成员,出现在类体中。...C++在使用类函数时,要注意调用它权限以及它作用域,私有的成员函数只能被本类中其他成员函数所调用,而不能被类外调用,成员函数可以访问本类中任何成员,可以引用在本作用域中有效数据。 ...一般做法是将需要被外界调用成员函数指定为 public,它们是类对外接口,但应注意,并非要求把所有成员函数都指定为 public。...这种函数作用是支持其他函数操作,是类中其他成员函数,类外用户不能调用这些私有的函数。  类成员函数是类体中十分重要部分。...C++类外定义成员函数 上述所讲成员函数是在类体中定义,在C++中也可以在类体中只写成员函数声明,而在类外面进行函数定义。

1.8K74

【C++】 类与对象——流操作符重载,const成员函数

& out) 作为成员函数重载,this指针占据第一个参数,Date必须是左操作数!...那为了规避这个问题,我们就要把函数中参数顺序改变,所以我们重载就不能是成员函数。...我们把重载<<作为全局函数来看呢 这时我们可以正确输出了,但是代价是我们成员变量改为公有了,不然我们在重载<<函数无法访问成员变量,这就让我们这个类变得不够安全,所以这里使用友元来解决。...: 所以需要加入const修饰: 对于一些只读函数,我们可以都加上const 让代码鲁棒性更加强大。...int GetMonthDay(int year, int month) const; //展示日期 void show() const; // 全缺省构造函数 Date(int year

10310

静态成员函数和非静态成员函数区别?

一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象指针this。...f(Sc &s) 10 { 11 s.nsfn(10); // 转换为Sc::nsfn(&s , 10) 12 s.sfn(10); // 转换为Sc::sfn(10) 13 } 函数...对nsfn()调用,编译像注解那样进行转换,s地址作为第一个传递参数。(你并不实际写该调用,由编译来实现。)...在函数内部,Sc::nsfn()对非静态成员访问将自动把this参数作为指向当前对象指针。而当Sc::sfn()被调用时,没有任何对象地址被传递。因此,当访问非静态成员时,无this指针出错。...这就是为什么一个静态成员函数与任何当前对象都无联系原因。

1.8K90

C++11 利用const_cast和type_traits修改类成员常量通用模板函数

我们可以把上面的代码写成一个通用模板函数。。。。以后只要调用模板函数就成了,就可以把代码简化为1行。...下编译通过 不论new_value是个左值还是右值都可以正常调用 modify_const,模板函数modify_const用法: const size_t c = 21; modify_const...(c,5ULL);//调用模板函数将常量c值修改为5, //注意size_t 在64位系统下定义为unsigned long long,所以这里参数5必须有类型限定后缀ULL才能与第一个参数基本类型保持一致...(u1,u2);//修改对象常量 modify_const只是在C++语法上实现了修改const修饰常量,其实只对类成员常量以及非基本类型局部常量有效,对于函数局部基本类型常量修改是无效。...对于全局常量或类静态常量成员,因为位于程序常量存储区,受CPU指令级内存保护(只读),所以是不能被修改,虽然修改全局常量或类成员静态常量代码也能编译通过,但实际运行时会抛出内存访问冲突异常。

52140

【C++】构造函数初始化列表 ③ ( 构造函数 初始化列表 中 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类 成员变量 提供初始值 ; 初始化列表 可以 调用 类 成员变量 类型 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...中传入 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 初始化列表 中 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 中定义了 被 const 修饰 成员变量..., 那么该成员变量 必须被初始化 , 否则会报错 ; 对象中 const 成员 必须在 声明后 立刻进行初始化 ; const 成员初始化 只能通过 构造函数 初始化列表 进行初始化 ; 注意...进行赋值 , 因此 这里 必须在 构造函数 初始化列表中 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 类 B 中 , 定义了常量 const int

18730

C++类静态数据成员和静态成员函数

静态成员函数 一般都是在静态成员函数中修改静态数据成员,在刚刚手机类声明中成员函数: static void change(); 就是静态成员函数。...我们给它来一个类外定义: void redmik30pro::change() { battery-=10; } 要注意是,静态成员函数只能访问静态数据成员和静态成员函数,不能访问非静态数据成员,如果要访问非静态数据成员...但是非静态成员函数可以任意地访问静态成员函数和静态数据成员。 那静态成员函数存在意义是什么?...首先,可能你在做题时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在类创建时候就存在了,在没有创建类对象时候就已经存在静态成员函数,而普通函数必须在类对象被创建时候才能被使用...简而言之,静态成员函数是服务于类,而不是某个类对象,它方便在于不需要定义类对象就能使用。

16230

C++核心准则Con.2:默认情况下,将成员函数定义为const类型

只要没有修改对象可观察状态,就应该将成员函数定义为const类型。这是设计意图更清晰表达,可以带来更好可读性,方便编译器捕捉更多错误,而且有时还会带来更多优化机会。...类型成员函数可以通过mutable对象或者借助指针成员修改对象值。...说明这件事另一个方式是常量属性是不可传递。一个const成员函数修改mutable成员值,或者通过一个非const指针访问对象值都是可能。...保证这种修改只有在符合其向用户提供语义(不变量)是这个类工作。...如果一个函数没有定义为const类型,有没有执行针对任何成员变量非常量操作,标记它。

68520

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

从输出可以看出几点,一是构造对象之前,必须先构造对象成员;二是对象成员构造顺序与定义时顺序有关,跟初始化列表顺序无关;三是构造顺序和析构顺序相反;四是如果对象成员对应类没有默认构造函数,那对象成员也只能在初始化列表进行初始化...(二)、const成员、引用成员初始化 #include  using namespace std; // const成员初始化只能在构造函数初始化列表中进行 // 引用成员初始化也只能在构造函数初始化列表中进行...// 对象成员(对象成员所对应类没有默认构造函数初始化,也只能在构造函数初始化列表中进行 class Object { public:     enum E_TYPE     {         ...因为const 变量或者引用都得在定义时候初始化,所以const 成员和引用成员必须在初始化列表中初始化。另外,可以使用定义枚举类型来得到类作用域共有的常量。...; 如果类中没有定义拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类公有成员,所做事情也是简单成员复制 #ifndef _TEST_H_ #define _TEST_H_ class

1.3K00

static修饰成员变量及函数

static成员变量又称为静态成员变量,在多个对象间共享使用,并且static静态变量在初始化时必须在类外初始化,可以直接通过“类名::变量”访问,哪怕是还没有生成对象时一样可以访问,以此看来static...成员变量不隶属于某个对象,而隶属于类,只是所有该类对象都可以使用而已。...另外,静态成员函数不在于多个对象之间信息共享,而是在于管理类内static数据成员,完成对static数据成员封装。...CStatic { public: CStatic(int l, int w) { length = l; width = w; } static void set_height() { // 静态函数操作静态成员...,静态函数没有this指针 height = 20; } int show_box() { return length * width * height; } private: int length;

14430
领券