C++中const

【const】

0.普通const对象定义在栈空间中

{
    int a = 10;
    const int b = 100;
    cout << &a << ‘ ‘ << &b;
}

Result:

 0x22abec 0x22abe8

注:Code::Blocks + Cygwin测得。

1.对变量类型加以限定,使之不能被修改;

const int e1 = 100;

e1 = 101; // error

2.const对象必须被初始化;

const int e2; // error

3.const对象和non-const对象可以通过彼此进行赋值;const对象也可以通过表达式进行初始化;

int get_size() { return 100; }

int main()
{
    int i = 10;
    const int a = i; // non-const to const
    const int b = a; // const to const
    int c = a; // const to non-const
    int d = i; // non-const to non-const

    int e = get_size();

    return 0;
}

4.默认情况下,const对象仅在文件内有效(From定义之后To文件末尾);

5.要在多个文件内共享一个const对象,需要使用extern关键字;

《C++ Primer》第五版的说法有一点问题,即“对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了”。

经过测试:可以在定义时不添加extern关键字,即下面的代码是可行的:

// file1.cpp
const int a = 100;

// file2.cpp
extern const int a;

但在声明和定义时都添加extern关键字应该是“最佳实践”,即在定义时就说明此const变量为整个工程可见。

6.const引用

6.1 不能通过const引用修改对象的值,无论其指向的对象是否为const对象;

6.2 非const引用不能指向一个const对象;

{
    int i = 10;
    const int a = i;

    int& b = i;
    int& c = a; // error, 6.2
    const int& d = i;
    d = 1000; // error, 6.1
    const int& e = a;
    e = 1000; // error, 6.1
}

6.3 将一个const引用绑定到另外一种类型上发生了什么:

{
    double dval = 3.14;

    const double& rd = dval;
    const int& ri = dval;

    cout << &dval << ‘ ‘ << &rd << endl;
    cout << &dval << ‘ ‘ << &ri << endl;
}

Result:
0x22abd8 0x22abd8 // ok
0x22abd8 0x22abe4 // wrong!

整形const引用的地址和dval的地址不一致。《C++ Primer》解释说,这是因为类型转换发生时,ri指向的是一个临时变量,并且,C++将这种行为归为非法。

但却能run起来。

7.指向和const

7.1 指向const对象的指针(pointer to const):a.禁止指向非const对象的指针 指向 const对象;b.禁止将 指向const的指针 赋值给 指向非const的指针;

7.2 不能更改指向const对象的指针的值;

{
    const double cpi = 3.14;
    double *ppi = &cpi; // error, 7.1.a
    const double *cppi = &cpi;

    double pi = 3.14;
    double *ppi2 = &pi;
    *ppi2 = 1000.0;
    const double *cppi2 = &pi;    ppi2 = cppi2; // error, 7.1.b
    *cppi2 = 100.0; // error, 7.2
}

7.3 常量指针(const pointer):必须初始化、一旦完成初始化就不能更改、若所指对象非const,则可以修改其值;

{
    int a = 100;
    int b = 1000;

    int *p1 = &a;
    *p1 = 200;
    p1 = &b;

    int* const cp2 = &b;
    *cp2 = 201; // ok
    cp2 = &b; // error, pointer is const

    int* const cp3; // error, uninitialized
}

8.顶层const,底层const

顶层const:对象本身是否为常量,整数本身、对象本身、指针本身,即自己,不能改变自己;

底层const:指针 所指对象是否为常量,不能改变指针 所指对象 的值;

const int * const pi = &a; // 1.前一个const为底层const,后一个const为顶层const;2.从右往左阅读法;

9.类与const

9.1 const成员函数

作用:修改隐式this指针的类型。添加const之后,this指针所指对象的普通数据成员(非static非mutable)不能被更改。

类型转换实值:将 T* const this 更改为 const T* const this,此时,this指针所指对象可以是const对象。

9.2 const对象,以及const对象的引用或指针都只能调用const成员函数;

struct X {
    X(int x, int y) : ex(x), ey(y) {};

    void display1() { cout << ex << endl; }
    void display2() const { cout << ey << endl; }

    int ex;
    int ey;
};

int main()
{
    X x(12, 23);
    x.display1();
    x.display2();

    const X cx(34, 45);
    cx.display1(); // error, display1为非const成员函数
    cx.display2();

    return 0;
}

9.3 若成员函数为const,则其声明和定义都必须添加const(与上面说的extern的用法不同);

9.4 成员函数可以根据const属性进行重载;

struct X {
    void display() {}
    void display() const {}
};

9.5 const成员变量:a.不能被修改;b.能进行类内初始化;c.若已类内初始化,则可以使用默认构造函数;d.可以在构造函数初始化列表中初始化;

 1 struct X {
 2     X() {}; // 默认构造函数
 3     X(int x, int y) : ex(x), ey(y) {};
 4
 5     void display1() { cout << ex << endl; }
 6     void display2() const;
 7
 8     const int ex = 99; // 类内初始化
 9     const int ey = 100; // 类内初始化
10 };
11 void X::display2() const { cout << ey << endl; }

若未进行类内初始化,则默认构造函数不能通过编译,即当上面代码的8、9行没有赋值时,上面的默认构造函数不能通过编译,无论是否用到此默认构造函数;

若未进行类内初始化,又需要使用默认构造函数,可以在默认构造函数的初始化列表中给const成员变量赋值:

X() : ex(99), ey(100) {};

其中的99、100可以更改为其它表达式:

int out1 = 99;

struct X {
    X() : ex(out1), ey(out1+1) {}
    ...
};

-------------------------------------------------------------------

其它:

1.用于声明引用的const都是底层const,即不存在顶层const

const int a = 100;
const int & const b = a; // error: ‘const‘ qualifiers cannot be applied to ‘const int&‘

2.引用可以赋值给引用

int a = 10;

int& b = a;

int& c = b; // ok, b is a reference

但const引用不能赋值给非const引用

const int& c = a;

int& d = c; // error

时间: 2024-10-11 07:18:24

C++中const的相关文章

C++中const使用注意要点(一)

最近看<C++编程思想>发现自己的基础确实不牢固,也想起了以前写代码时也因为const的事情浪费过时间,这里总结下几个要点. 首先说下内部链接和外部链接. 当一个cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元.编译器对每个编译单元(.cpp文件)进行编译生成相应.obj文件.PS:.c文件对应.o文件 接下来关键一步:链接器将所有不相关的.obj文件进行链接,生成最终可执行文件(.exe文件) // a.cpp: #includ

c++ 中const的使用

在c++中,const是这么一个东西:如果你希望能够有一些东西是别人不能修改的,这个时候const就起作用了. const 在使用情况如下: a.修饰常量 const int a; int const a; 这里不论const放什么位置,效果其实都一样的. b.修饰指针: const double *p--const放于指针*之前,代表当前指针指向的内存是不可改变的. double *const p--const放于指针*之后,代表当前指针是不可改变的. const double *const

C++中const限定符的应用

const限定符用于限定变量或对象的值.const对象一旦创建其值不能再改变.在C++中,const与引用和指针相结合,有多种用法.下面将结合<C++ Primer>第五版的内容做一个较详细的介绍. 1.const对象初始化 const对象必须初始化,初始化可以是任意复杂的表达式,如: const int i=get_size(); const int j=42; 2.文件间共享const对象 当以编译时初始化的方式定义一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成对应的

c++中const关键字全面总结

一.const作用 1.const定义常量 注意:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用. (1)const修饰变量,以下两种定义形式在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. TYPE const ValueName = value; const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初

C++ 中 const 和 static 的作用

目录 const 的主要应用如下: const 关键字使用的注意点: C++中static关键字有三个明显的作用: const的主要应用如下: const 用于定义常量:const定义的常量编译器可以对其进行数据静态类型的安全检查. const 修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型的时候,将"值传递"改为"const 引用传递" 可以提高效率. const 修饰函数的返回值:如果给"指针传递"的函数返回值加const,则返回

C++中const用法总结

1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE,

C++中const简介

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的. const关键字的作用主要有以下几点: (1)可以定义const常量,具有不可变性. 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐

结合示例说明C++中const和指针结合时怎么理解

在之前随笔<C++中const使用要点(一)>中简单叙述了const int*.int* const和const int* const的区别,记住三句话就能在实际运用时用对,但是看书时发现了指针常量.常量指针这些名词,发现明白这些概念对阅读文章时还是比较重要的. 关键:const和指针结合时代码从右往左看 1.常量指针(const pointer) 概念:常量是形容词,也就是说常量指针是一个指针,用const修饰的指针. 按照代码从右往左(概念名词从左往右)的阅读顺序,不妨试着写一下. Ste

C/C++中const的用法

const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结const的用法. 1.const位置 const位置较为灵活,一般来说,除了修饰一个类的成员函数外,const不会出现先一条语句的最后.示例如下: #include <iostream> using namespace std; int main(int argc,char* argv[]) {

C++中const char * const name;char * const name;cons

C++中const char * const name;char * const name;const char * name三者之间的区别? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:HG Zhao链接:http://www.zhihu.com/question/26908463/answer/34499495来源:知乎 const *说明指向的是常量.* const说明指针是常量.const * const说明指针和指向的都是常量.