魔法罐子

C++ 笔记(const)

2018-10-10

修饰成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int main(){
int a1=10; // 非常量
const int a2=a1; // 常量
int* a3 = &a1; // 非 const 的指针
const int* a4 = &a1; // 指针可以变,但是数据不能变
int const *m = &a1; // 和上面一样
int* const a5 = &a1; // 指针不可变,数据可以变
int const * const a6 = &a1; // 数据和指针都不能变
const int * const a7 = &a1; // 同上
return 0;
}

主要的难点在于 const 的位置,比较灵活,记住这三点:

  1. 一个 const,如果 const 在 * 前面, 表示指针所指 数据是常量 ,不能通过解引用修改该数据; 指针本身是变量 ,可以指向其他的内存单元。

  2. 一个 const,如果 const 在 * 后面,表示 指针本身是常量 ,不能指向其他内存地址;指针所指的 数据可以通过解引用修改

  3. 两个 const,* 左右各一个,表示指针和指针所指数据都不能修改。

修饰函数参数

1
2
3
4
void hello(const int x)
{
x=5;// 编译出错
}

这个很好理解,传递过来的参数不可修改。

修饰成员返回值

分两种返回值,指针传递或者值传递。

  1. 指针传递
1
2
3
4
5
6
7
8
9
10
11
const int* hello()
{
int*a = new int(10);
return a;
}
int main()
{
const int* a = hello();
int* b = hello();// 编译出错
return 0;
}

按照修饰成员变量的判断法则,const 在 * 前面,所以指针是变量,值是常量。

  1. 值传递
    对于值传递来说,函数会把返回值复制到外部的临时存储单元中,加了 const 修饰没有任何价值。所以 对于值传递来说,加 const 没有太多意义

修饰成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
class Point{
int x;
public :
Point(int _x):x(_x){}
void hello(int _x) const
{
x=_x;// 错误,在 const 成员函数中,不能修改任何类成员变量
modify_x(_x);// 错误,const 成员函数不能调用非 onst 成员函数,因为非 const 成员函数可以会修改成员变量
}
void modify_x(int _x)
{
x=_x;
}
};
  1. const 修饰的成员函数不能修改任何的成员变量 (mutable 修饰的变量除外 )
  2. const 成员函数不能调用非 const 成员函数,因为非 const 成员函数可以会修改成员变量

const 强制转化

const_cast 是用来移除变量的 const 或 volatile 限定符

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main()
{
const int constant = 21;
const int *const_p = &constant;
int *modifier = const_cast<int *>(const_p);
*modifier = 7;
cout << "constant:" << constant << endl; //constant: 21
cout << "const_p:" << *const_p << endl; //const_p: 7
cout << "modifier:" << *modifier << endl; //modifier: 7
}

constant 还是原来的值,但是 const_p 的值变了,因为指针可以修改,但是 const_p 的值不能变,所以 const_p 和 modifier 指向了同一个地址,所以他俩的值一样。平时不会这么用,我认为用的比较多的是在参数传递上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
using namespace std;
// 这是一个底层的接口,没办法对这个接口进行修改
const string &hello(const string &a1, const string &a2)
{
return (a1.size() < a2.size()) ? a1 : a2;
}
int main()
{
string a1 = "123", a2 = "1111111";
//string& result = hello(a1,a2) 由于定义的是 const 返回值,参数也是 const,所以这样写肯定报错。
string &result = const_cast<string &>(hello(const_cast<const string &>(a1), const_cast<const string &>(a2))); // 这样就可以了
cout << result << endl;
}
Tags: c++ const
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章