const 小节
程序员文章站
2022-03-01 20:52:51
...
目录
修饰函数参数
表示参数不能被修改,如下:
void StringCopy(char*strDestination, const char *strSource);
在函数参数前添加 const 表示该函数实现中不能修改 strSource 所指向的内容。
因为函数调用涉及到传参,“值传递” 往往会导致参数的复制,甚至有构造和析构,效率往往比较低。如果使用 void func( A &arg ) 又怕内容遭到修改,而添加一个 const 就可以避免了:void func( const A &arg )。
修饰函数返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改(C++ 编译器报错,C 可以但是有 warning),该返回值只能被赋给加 const 修饰的同类型指针。例如函数
const char *getString();
// 下面的使用方法会有问题:
char *b = getString();
// 正确的用法
const char *b = getString();
以 const & 形式返回的表示返回本身,没有进行复制,但是要注意:千万不要返回局部对象的引用;千万不要返回指向局部对象的指针!
const char &getString();
当使用了 const 关键字后,即意味着函数的返回值不能立即得到修改!如下代码,将无法编译通过
char a[10] = {'a', 'b', 'c'};
const char& getData()
{
return a[2];
}
int main()
{
getData()++;
printf("a[2] = %d\n", a[2]);
return 0;
}
但是,将 const 去掉后,就能返回正确的值。
修饰成员函数
对于用 const 后缀修饰的成员函数,表示不能修改成员参数。
class A
{
public:
int getCounts() const
{
counts++; // 修改了 counts 值,会编译报错
return counts;
}
private:
int counts;
}
修饰成员变量
对于使用 const 修饰的成员变量,初始有两种:在声明时初始化,在构造函数的初始化列表中初始化。
class A
{
private:
// 方法一:声明时初始化
const int counts = 0;
public:
// 方法二:初始化列表
A():counts(0)
{
}
}
初始化列表是先于构造函数的函数体执行的,并且初始化列表中的参数初始化顺序跟参数在列表中的写法顺序无关,跟在类中声明的顺序相关。
上一篇: Spring小节