首页 > 编程语言 >C++中const小结

C++中const小结

时间:2024-03-22 22:44:06浏览次数:29  
标签:const 函数 int 成员 42 C++ 修饰 小结

const 修饰普通变量

表示变量的值不能被改变。下面两条语句(第2行和第3行)表示的意思一致。

int a;
const int ca = 42;
//int const ca = 42;

const 修饰指针

指向常量的指针不能改变其指对象的值。第 5 行代码是错误的。

int a = 42;

const int * ip = &a;
int const * ipp = &a;
//*ip = 42;

常量指针不能改变其指向,也就意味着它必须要初始化。但是,可以通过常量指针改变其所指对象的值,如第 6 行代码,最终打印结果会是 56

int a = 42;
int b = 25;

int * const p = &a;
//p = &b;
*p = 56;
cout << "a: " << a << endl;

常量指针,同时它指向一个常量

const int a = 42;
const int * const p = &a;

const 与引用

临时对象的常引用。第2行代码会报错,不能将double类型引用绑定到int类型变量上。但是,加了const修饰后,就没有问题了。

int a = 42;
//double &f = a;
const double &f = a;

本质上,const引用,引用了一个不可改变的临时变量。编译器把代码处理成了如下形式

	const double temp = a;
    const double &f = temp;

const 修饰函数参数

如果第1行代码参数中没有const,则会报错,不能将一个非const左值引用类型绑定到一个右值(临时对象)上。故将参数修改为常引用

void foo(const std::string &str)
{
    cout << str << endl;
}

int main()
{
    foo("abcd");

    return 0;
}

const 修饰类数据成员

const修饰数据成员,称为常数据成员,可能被普通成员函数和常成员函数来使用,不可以更改。

必须初始化,可以在类中(不推荐),或者初始化列表中(这是在类对象生成之前唯一一次改变const成员的机会了)。

class A
{
public:
    A(int i)
        :_ci(i)
    {
        cout << "A(int i)" << endl;
    }

    ~A()
    {
        cout << "~A()" << endl;
    }

    void dis()
    {
        cout << _ci << endl;
    }
private:
    //const int _ci = 100;  // 不推荐
    const int _ci;
};


int main()
{
    A a(42);
    a.dis();

    return 0;
}

const 修饰类成员函数

  • const修饰成员函数,承诺在本函数内部不会改变类内的数据成员,因此,也只能调用承诺不会改变成员的其它const成员函数,而不能调用其它非const成员函数。

  • const修饰成员函数,放在声明之后,实现体之前。

  • 23行代码,它只能调用const成员函数,如果函数dis()是没有const修饰的话,第23行代码将会报错。

class A
{
public:
    A(int i, double d, float f)
        :_ci(i), _cd(d), _fe(f)
    {
        cout << "A()" << endl;
    }

    ~A()
    {
        cout << "~A()" << endl;
    }

    void dis() const
    {
        cout << _fe << endl;
    }

    void foo() const
    {
        //_fe = 4.56;
        dis();
    }
private:
    const int _ci;
    const double _cd;
    float _fe;
};


int main()
{
    A a(42, 25, 3.14);
    a.foo();

    return 0;
}

const 修饰对象

const修饰对象,保证在对象层面,不会修改数据成员。所以const对象,只能调用const成员函数。

参考资料

Stanley等《C++ Primer e5》
王桂林《C++基础与提高》

标签:const,函数,int,成员,42,C++,修饰,小结
From: https://www.cnblogs.com/zhe666/p/18090544

相关文章

  • [c++/gcc] Centos 7.9升级 gcc 4.8.5 到 gcc11 [转]
    0序本文背景:因在centos7.9server上安装nodejs21.7.1,编译nodejs时,依赖了gnu17/gcc11。例如:遇到Qtrequiresc++11support、-std=gnu++17例如:编译器不支持c++17,就会提示:g++:error:unrecognizedcommandlineoption‘-std=c++17’例如:编译器不支持c++17,就会提示:g++:......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......
  • 【C++】string类模拟实现
    个人主页:zxctscl如有转载请先通知文章目录1.前言2.构造函数和析构函数3.遍历3.1下标+[]3.2迭代器4.Modifiers4.1`push_back`和`append`4.2+=4.3insert4.4erase4.5swap5.Capacity5.1resize5.2clear6.深浅拷贝6.1浅拷贝(值拷贝)6.2深拷贝7.String......
  • C++暴力指南
    关于暴力做法暴力,非常直白的就是直接硬做,不管他循环有多大,不管他数据量有多大。你要记住的一个事情就是,暴力只面向小数据,但是必定能得到正确解(前提当然是你没写错)甚至你需要进行对拍的时候你也得先写一个暴力出来才能方便对拍。但是也因此,为了尽可能的偷分,暴力里要做尽可能的比......
  • C++流媒体开源库Live555详细介绍
    C++流媒体开源库Live555详细介绍C语言资深大师  5人赞同了该文章1、Live555简介Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它使用了RTP/RTCP、RTSP、SIP开放标准协议,实现了标准流媒体传输。Live555实现了对多种音视频编码格式的音视频......
  • C++ 指针,指针引用,二级指针作为实参传入函数体,形参改变指向的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、形参指向变化,实参指向不变二、指针引用传递改变实参指向三、二级指针**传递改变实参指向一、形参指向变化,实参指向不变前提了解:无论是值传递,指针传递,引用传递,形参和实参都是完全不同的......
  • C++中char,char*,char[],string存储中文的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用char,char*,char[],string存储中文二、内存中是乱码,但是可以正常输出三、解决方法:w_char,前言学习时遇到的问题,如有不对,欢迎大佬们批评指正!一、使用char,char*,char[],string存......
  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......