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

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

在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。...初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。...const成员函数(常成员函数) const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。...我们通常将 get 函数设置为常成员函数。读取成员变量的函数的名字通常以get开头,后跟成员变量的名字,所以通常将它们称为 get 函数。...char *getname() const和char *getname()是两个不同的函数原型,如果只在一个地方加 const 会导致声明和定义处的函数原型冲突。

30930
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++中类的数据成员初始化次序

    分享一个之前学的知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢?...根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效...,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?...所以当一个数据成员同时拥有就地初始化和初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。...如果到代码中的有参构造函数的函数体中加上 this->id = 20; ,运行结果会变为: 0 n = 1,id = 1 n = 1,id = 20 可以看到赋值把初始化列表给id初始化的值覆盖掉了

    85020

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

    公有属性 一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况...我们需要一个成员为所有对象所公有,而且在需要更新这个公有属性的时候只需修改一次。 因此,C++提供了静态数据成员来描述类对象相同的属性。...静态数据成员 类的静态数据成员是属于这个类的,而不是属于某个对象的。...在类定义的时候非静态数据成员是不分配内存的,只有在创建类对象的时候才分配内存,但静态数据成员是要分配内存的,因为它是属于类的,只有一块内存,所以要初始化它,而且不能在类的声明中初始化,必须要在类外初始化...静态成员函数 一般都是在静态成员函数中修改静态数据成员,在刚刚的手机类声明中的成员函数: static void change(); 就是静态成员函数。

    19230

    C++核心准则C.134:确保所有非常量数据成员具有相同的访问权限‍

    C.134: Ensure all non-const data members have the same access level C.134:确保所有非常量数据成员具有相同的访问权限‍ Reason...避免可能导致错误的逻辑混乱。如果非常量数据成员的访问权限不同,该类型想做什么就模糊不清。这个类型是在维护一个不变量还是简单的数据集合?...属于分类A的数据成员定义为公有就行(或者,特殊情况下如果你希望派生类能看到它们也会定义为保护)。它们不需要包装。系统中的所有代码可以看到并修改它们。...属于分类B的数据成员应该定义为私有或常量。这是因为封装很重要。...标记那些非常量数据成员具有不同访问权限的类。

    78010

    实际工程中的 C++ 模板

    C++ 的模板是 C++ 的一个重要的语言特性,我们使用的 STL 就是 Standard Template Library 的缩写,但是在很多情况下,开发者都对其敬而远之,有些团队甚至是直接在工程中禁用模板...模板常被当作洪水猛兽的一个原因是许多人提起模板就要提 C++ 模板图灵完备,甚至还要再秀一段编译期排序,这种表现模板强大的方式不仅不会让人觉得模板有用,反而让人觉得模板难以理解而且不应该使用。...在这篇文章里,我将聊一下最近实际工程中的一些模板的应用,希望可以让更多人了解到模板并不是一个可怕的存在,以及一些常见的使用方式。...我们知道,C++ 的模板有个规则是 SFINAE,这不是一个单词,而是 Substitution Failure Is Not An Error 的缩写,也就是说,编译器在基于模板生成代码时,如果将模板的类型参数置换为给定的类型时...小结 在这篇文章里,我们看到了在实际工程中 C++ 模板的一些应用。很显然,这些功能脱离了模板的能力是非常难以实现的。

    2.1K20

    结构体成员在内存中的对齐方式

    以下我会举两个结构体的例子,分别画图的方式表达对齐的原则。 结构体对齐的公式 记住以下这些规则,把结构体往里面套就可以了。...以 #pragma pack(x) 中 x 的大小和结构中占用空间最大的成员做比较,取小值为 n(外对齐依据) 以 n 值和结构体每个成员比较,得出结果列表为 m[x] 根据每个成员的大小依次向内存中填充数据...案例一 我们来看一个简单的案例,#pragma pack(4) 为 4,结构体中有 char、short、int 3个成员,其对齐的方式如下图表示: #include #pragma.../struct sizeof(DATA) = 8 案例二 这个案例中,我们把 #pragma pack(8) 设定为 8,结构体中有三个成员 char、double、int,其对齐方式如下图: #include.../struct_size sizeof(DATA) = 24 要注意的是,如果你把这个案例中 int 和 double 成员颠倒个位置,再编译代码你会发现其占用空间变成了 16,按上面的规则推断一下,

    21330

    【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

    不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 仍然是 public 成员 ; 父类中的 protected 成员 仍然是 protected...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 protected 成员 ; 父类中的 protected 成员 仍然是 protected...成员 ; 父类中的 private 成员 仍然是 private 成员 ; private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限 变为 private , 基类的 所有成员...都不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 private 成员 ; 父类中的 protected 成员 变为 子类中的 private 成员 ; 父类中的 private...; 或 对象名.静态成员名 child.c = 30; 的方式 , 访问 继承自 父类的 静态成员 ; 4、静态成员使用要点 参考 【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |

    54710

    C++初阶(类中的默认成员函数)

    类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...先说概念吧 1.1概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。...内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,对于内置类型,编译器会提供一个随机值,但是对于自定义类型,编译器会调用它的构造函数...1.3C++11的更新 在C++11的标准里,针对内置类型的成员不能初始化的缺陷,打了个补丁,就是:内置类型成员变量在类中声明时可以给默认值 #include using namespace...若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数。 我们要知道析构函数是自动调用的,怎么证明这点呢?我们来写代码吧!

    15910

    【C++】—通俗易懂的理解C++中的模板

    前言: 模板就相当于我们高中写作文时套用的作文模板,在大多数情况下是可以通用的。那么我们要是在编程中也想利用这种方式呢?那就不得不提起泛型编程——编写与类型无关的通用代码,是代码复用的一种体现。...1.4 函数模板的实例化 不同类型的参数使用模板时,称为函数模板的实例化,模板参数实例化又分为隐式实例化和显式实例化   隐式实例化:让编译器根据实参来推演出对应的函数类型 template<typename...//隐式实例化 double m = 2.0; double n = 3.0; Add(m,n); //隐式实例化 //但不能像下面这样传,一个传int类型,一个传double类型,因为模板参数列表中只有一个...1.2 类模板的格式 template class 类模板名 {  类中成员定义 }; //类模板 template class Point {...最后: 以上就是对c++模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待

    5710

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

    一、常量成员函数 1、const 修饰成员函数分析 在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 类中 , 定义了 void fun(int...: void Student_fun(const Student* const pThis, int age, int height) 左数右指 , const 在 * 左边修饰的是内存中的数据, const...* pThis, int age, int height) // 左数右指 , const 在 * 左边修饰的是内存中的数据, const 在 * 右边修饰的是指针本身 void fun(int...Student* pThis, int age, int height) // 左数右指 , const 在 * 左边修饰的是内存中的数据, const 在 * 右边修饰的是指针本身 void...Student* const pThis, int age, int height) // 左数右指 , const 在 * 左边修饰的是内存中的数据, const 在 * 右边修饰的是指针本身

    22920

    C++中的static成员函数以及static成员变量详解「建议收藏」

    static成员变量,在编程中我们时常都会遇到,那么你是否对static变量以及static成员函数有一定深入的认识呢?...static定义的成员变量,存储的区域是内存四区(栈区、堆区、全局区、代码区)中的全局区,在程序运行之前就已经生成在全局区中,直到程序运行结束才会被系统释放。...,也可以使用对象进行调用访问 system("pause"); return 0; } 在C++中有时会定义一些static变量,同时也会定义一些static成员函数。...); 2.static成员变量(属性)并不占用类的内存空间,static成员变量并不存储在类中,存储在全局区; 3.static成员变量(属性)时所有对象共同拥有的一份变量,并不属于任何一个对象成员;...4.static成员属性以及static成员函数都不存在this指针(并不属于任何一个成员); 5.static成员属性能够被继承,可以在派生类中访问到(前提:原有属性为公有,继承为公有继承),但是存储的只是一份数据

    83430

    今天你学C++了吗?——C++中的模板

    ~对于不同的类型,我们是一个个写的,事实上它们的逻辑是相似的,只是它们的类型不一样而已~所以这个时候C++就引入了模板这个概念~模板分为函数模板和类模板~ 接下来,我们一起来看看~ 函数模板 函数模板概念...void Swap(T& a, T& b) { T t = a; a = b; b = t; } 我们可以使用它交换任意类型,这里面的T可以在程序运行时被C++语言支持的任意数据类型取代~这里进行简单测试...函数模板的实例化 》 用不同类型的参数使用函数模板时,称为函数模板的实例化。...(模板类似于半成品,而非模板函数也就类似于现成的,编译器也会偷点小懒~), 如果模板可以产生一个具有更好匹配的函数, 那么将选择模板(最优匹配原则) 》 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换..., 类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可 (也就是 只能显示实例化 ) 》 类模板名字不是真正的类,而实例化的结果才是真正的类 //通过模板实例化出不同的类

    3100

    C++初阶——(类中的默认成员函数)下

    时隔多天的类中的默认成员函数,在上篇博客中我们讲了,构造函数和析构函数。简单回顾下,构造函数就是类似于初始化函数,他的函数名与类名相同,且没有返回值。...注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,二自定义类型是调用其拷贝构造函数完成拷贝的。...2.赋值运算符重载 2.1运算符重载 2.1.1概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊意义函数名的函数,也具有其返回值类型,函数名以及参数列表,其返回值类型与参数列表与普通函数类似...C++规定:后置++在重载时多增加一个int类型的参数,但调用函数时不用传第,编译器会自动传递。...3.const成员 将const修饰的“成员函数”称为const成员函数,const修饰成员函数实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

    9110

    C++:40---继承中类成员的变化关系

    一、派生类继承基类成员的规则 ①派生类继承了基类的所有数据成员与函数(不论公有成员、保护成员、私有成员) ②派生类虽然继承了基类的所有成员,但是能不能访问基类的成员还与父类成员的属性(public、protected...、private)以及继承方式有关 ③类静态成员:如果基类定义了一个静态成员,那么该静态成员在整个继承体系中都存在。...该静态成员只能定义一次,派生类不能再次定义 一个类改变了静态成员的值,整个继承体系中的值都将改变 #include using namespace::std; class A {...public: int b_data; B(int data) :A(data), b_data(data) {} void showB(){} }; 可以看到B公有继承于A,B可以在类内访问父类A的所有...public、protected成员,但不能访问private成员 由于父类的protected成员在子类中也是protected的,所以不能在外部直接使用 ?

    55310

    【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )

    一、继承中成员变量同名的处理方案 1、继承中成员变量同名的场景说明 子类 继承 父类 的 成员 , 如果 子类 中定义了 与 父类成员变量 同名的 变量 , 子类 仍然 可以 继承 父类的 同名 成员变量...: 继承自父类的成员变量 , 使用 父类名称::成员变量名称 替代 成员变量名称 , 如 : Parent 是父类名称 variable 是父类中的变量名称 如果子类中也定义了 variable...子类中使用该方式 访问 父类中的 variable 变量 ; Parent::variable 子类的成员变量名称 , 可以使用 Child::variable 的方式进行访问 , 也就是可以不使用域作用符..., 也可以不使用域作用符 , 直接访问 b ; 子类 Child 中 , 定义了 print 成员函数 , 在该函数中 , 通过 Parent::b 访问 继承自父类的 b 成员 , 通过 Child:..., 访问 继承自父类的 成员变量 ; Child child; // 访问 子类对象 child 中 继承自 父类的 b 成员 child.Parent::b = 10; 完整代码示例 : #

    42420
    领券