const的常用用法大总结
CC++中CONST用法总结(推荐)
CC++中CONST⽤法总结(推荐)
1、修饰常量时:
const int temp1; //temp1为常量,不可变
int const temp2; //temp2为常量,不可变
2、修饰指针时:
主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本⾝为常量;
const int *ptr; //*ptr为常量;
int const *ptr; //*ptr为常量;
int* const ptr; //ptr为常量;
const int * const ptr; //*ptr、ptr均为常量;
3、const修饰类对象时:
const修饰类对象时,其对象中的任何成员都不能被修改。const修饰的对象,该对象的任何⾮const成员函数都不能调⽤该对象,因为任何⾮const成员函数都会有修改成员变量的可能。
class TEMP{
void func1();
void func2() const;
}
const TEMP temp;
temp.func1(); //错误;
temp.func2(); //正确;
4、const修饰成员变量:
const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值;
赋值是使⽤新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;⽽初始化列表开辟空间和初始化是同时完成的,直接给与⼀个值,所以const成员变量⼀定要在初始化列表中完成。
class TEMP{
const int val;
TEMP(int x)val(x){}; //只能在初始化列表中赋值;
c 语言 const 类型转换
c 语言 const 类型转换
const类型在C语言中的用法及特点
一、const类型的定义和作用
在C语言中,const是一种类型修饰符,用于定义常量。通过在变量声明前加上const关键字,可以将该变量定义为只读,即不允许对其进行修改。const类型在程序中起到了限制变量修改的作用,使得程序更加安全和可靠。
二、const类型的语法和规则
1. const关键字的使用方法:const 数据类型变量名 = 值;
2. const类型的变量必须在声明时进行初始化,且初始化后的值不能再修改。
3. const类型的变量在内存中一般存储在只读数据段(.rodata)中,并且在编译时就确定了其值。
4. const类型的变量可以用于定义数组、结构体、指针等各种数据类型。
5. const类型的变量可以用于函数参数和函数返回值的定义,起到了限定参数和返回值的作用。
三、const类型的特点和优势
1. 提高程序的可读性和可维护性:const类型可以明确指定变量的值,使得程序的逻辑更加清晰,减少错误的发生。
2. 预防变量被意外修改:通过将变量定义为const类型,可以防止
在程序中对变量的不必要的修改,提高程序的稳定性和安全性。3. 优化编译器的优化能力:由于const类型的变量在编译时就确定了值,编译器可以在编译过程中进行优化,提高程序的执行效率。
4. 方便进行代码维护和重构:在程序中使用const类型的变量,可以方便地进行代码维护和重构,减少程序的耦合度。
四、const类型的应用场景
1. 定义常量:const类型可以用来定义程序中的常量,例如定义π的值为3.14159。
const的用法
const的用法
在程序设计中,我们经常会用到const关键字,它用于定义常量,即一旦被定义,其值就不能被修改。const的使用可以使程序更加安全、可维护、易理解。本文将介绍const的用法及其在不同场合下的应用。
一、const的定义与声明
const关键字用于定义常量,一旦被定义,其值就不能被修改。常量可以用于多种情况,如表示数值、字符串、地址等。
const的定义方法如下:
const 类型说明符常量名 = 常量值;
例如:
const int MAX_NUM = 100;
const char* STR = 'Hello World!';
在定义常量时,我们可以使用const修饰符来声明一个变量为常量。例如:
const int MAX_NUM = 100;
在这个例子中,MAX_NUM被声明为一个常量,其值为100,不能被修改。
二、const的作用
1.保护变量不被修改
const关键字可以保护变量不被修改,从而避免了因修改变量值而引起的错误。例如:
const int MAX_NUM = 100;
MAX_NUM = 200; // 编译错误
2.提高代码的可读性和可维护性
使用const关键字可以提高代码的可读性和可维护性。常量的值是固定的,不会被修改,这样可以使代码更加清晰、易懂。例如: const int MAX_NUM = 100;
...
if (a > MAX_NUM) {
...
}
在这个例子中,MAX_NUM表示最大值,如果代码中直接使用100,可能会让人感到困惑,但是使用MAX_NUM则可以让代码更加易懂。
通达信const函数
通达信const函数
一、函数介绍
通达信const函数是一个用于计算股票技术指标的函数,它可以帮助
股票投资者快速准确地了解股票的趋势和走势,从而做出更明智的投
资决策。该函数具有计算简单、易于理解和使用等特点,是股票分析
领域中常用的技术指标计算方法之一。
二、函数原理
通达信const函数是基于一定的数学公式和统计方法来计算技术指标的。它主要涉及到以下几个方面:
1. 数据处理:通达信const函数需要对输入数据进行处理,包括去除
无效数据、调整数据顺序等。
2. 参数设置:通达信const函数需要设置一些参数来确定计算方式和
结果。
3. 计算公式:通达信const函数使用一定的数学公式来计算技术指标。
4. 输出结果:通达信const函数将计算结果输出为一个数组或一个矩阵,以便后续分析和使用。
三、常用技术指标
1. 均线:均线是通过对股票价格进行平均处理得到的。常见的均线包
括5日均线、10日均线、20日均线等。
2. MACD:MACD是移动平均收敛/发散指标的缩写,是一种常用的
趋势指标。它由快速移动平均线、慢速移动平均线和MACD柱组成。
3. KDJ:KDJ是随机指标的一种,由K值、D值和J值组成。它能够
反映股票价格的超买超卖情况。
4. RSI:RSI是相对强弱指数的缩写,是一种衡量股票价格强度的指标。它主要关注股票价格在一定时间内上涨和下跌的幅度大小。
四、通达信const函数使用方法
1. 函数参数设置:通达信const函数需要设置一些参数来确定计算方
式和结果。这些参数包括计算周期、计算方法、输出类型等。
const 声明的函数
在编程中,`const` 关键字通常用于声明一个函数的参数或返回类型为常量。这意味着在函数内部,这个参数或返回值不能被修改。
在C++ 和Java 等语言中,你可以用`const` 关键字来声明一个函数,这通常用于说明这个函数不会修改其参数的值或者状态。这是一个很有用的特性,因为它可以增加代码的可读性和可维护性,同时减少错误和误解。
例如,在C++ 中,你可能会这样写一个函数:
```cpp
void printValue(int const& value) {
std::cout << value << std::endl;
}
```
在这个函数中,参数`value` 被声明为`const`,这意味着你不能在`printValue` 函数内部修改`value` 的值。这样做的好处是,如果你不小心尝试修改`value` 的值,编译器会报错,从而帮助你及早发现并修复错误。
在其他一些语言中,比如Python,虽然不存在`const` 关键字,
但是你可以通过一些约定俗成的方式(比如不修改参数的副本或者使用`_` 前缀来标记变量)来暗示一个变量是常量,从而起到类似的效果。
注意:在JavaScript、Python、Java 等语言中并没有直接提供`const` 关键字来声明常量。但是,可以通过一些约定俗成的规范,或者使用设计模式(如immutability)来实现常量的概念。例如,在JavaScript 中,你可以通过不修改对象的属性或者数组的元素来实现常量的概念。
const成员变量初始化总结
const成员变量初始化总结
const可以⽤来声明常量也就是说他的值不能被修改;
const成员必须在定义的时候同时初始化,不能进⾏赋值
如 const int a;a的值不能修改,不能给它赋值,如何才能让它⼀开始就拥有⼀个值?
1、在声明的时候对他进⾏初始化
const int a=1;
2、在函数中声明的形参,在函数被调⽤时会得到实参的值。
但是如果在类中呢?
1class Demo
2 {
3const int ci;
4public:
5void get_ci()
6 {
7return ci;
8 }
9 };
当直接⽤这个类定义⼀个对象时,会出错,提⽰没有初始化const成员变量值且提⽰ci是⼀个只读的变量
const⽤于类中成员变量时,将类成员变为只读属性(只读:不能出现在“=”的左边,但在类中仍可以⽤⼀个指针来修改其值。)所以不可以直接在类的构造函数中初始化const 的成员。
const成员变量只可以初始化列表中初始化
代码:
1 #include<iostream>
2using namespace std;
3class Demo
4 {
5private:
6const int ci;
7public:
8 Demo() :ci(10)
9 {
10
11 }
12int getci()
13 {
14return ci;
15 }
16int setci(int i)
17 {
18int* mi =(int *) &ci;
19 *mi = i;
20return ci;
21 }
22 };
23int main()
24 {
常量函数知识点归纳总结
常量函数知识点归纳总结
常量函数是一种特殊的函数,它具有一些独特的特性和用途。在编程中,了解常量函数的特点和用法对于设计和编写高质量的代码非常重要。本文将对常量函数的定义、特点、用法以及相关注意事项进行归纳总结。
一、常量函数的定义
常量函数是指在函数声明和定义中加上const关键字的函数。在C++中,常量函数的声明和定义分别如下所示:
```cpp
// 声明常量函数
void fun() const;
// 定义常量函数
void ClassName::fun() const {
// 函数体
}
```
在函数声明和定义的参数列表后加上const关键字即可将函数声明为常量函数。这使得函数在被调用时无法修改成员变量的值,从而实现了常量函数的特性。
二、常量函数的特点
常量函数具有以下几个特点:
1. 不能修改成员变量:在常量函数中,不允许修改任何类的成员变量。即使类的成员变量被声明为可变的(mutable),常量函数也不能修改它们的值。
2. 只能调用其他常量函数:常量函数只能调用其他常量函数,因为非常量函数有可能修改成员变量的值,这与常量函数的特性相悖。
3. 适用于常量对象:常量函数通常用于处理常量对象,因为常量对象的成员变量不能被修改。通过使用常量函数,可以确保对常量对象的操作不会改变对象的状态。
4. 不产生副作用:由于常量函数不能修改成员变量的值,它不会产生副作用。这使得常量函数更加安全和可靠,有利于编写健壮的代码。
5. 表现为类的不变性:常量函数可以用来表现类的不变性(invariant),即类在某一时间段内不会发生变化的特性。通过在常量函数中实现不变性,可以确保对象的状态不会被错误地修改。
const用法总结
1. const修饰普通变量和指针
const修饰变量,一般有两种写法:
const TYPE value;
TYPE const value;
这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。
例如:
const int nValue;//nValue是const
int const nValue;// nValue是const
但是对于指针类型的TYPE,不同的写法会有不同情况,例如:
A. const char *pContent;
B. char * const pContent;
C. char const *pContent;
D. const char* const pContent;
对于前三种写法,我们可以换个方式,给其加上括号
A. const (char) *pContent;
B. (char*) const pContent;
C. (char) const *pContent;
这样就一目了然。根据对于const修饰非指针变量的规则,很明显,A=C.
- 对于A,C, const修饰的类型为char的变量*pContent为常量,因此,pContent的内容为常量不可变.
- 对于B, 其实还有一种写法:const (char*) pContent;
含义为:const修饰的类型为char*的变量pContent为常量,因此,pContent指针本身为常量不可变.
- 对于D, 其实是A和B的混合体,表示指针本身和指针内容两者皆为常量不可变
CONST用法
CONST用法
面向对象是C++的重要特性.但是c++在c的基础上新增加的几点优化也是很耀眼的就const直接可以取代c中的#define
以下几点很重要,学不好后果也也很严重
const
1. 限定符声明变量只能被读
const int i=5;
int j=0;
...
i=j; //非法,导致编译错误
j=i; //合法
2. 必须初始化
const int i=5; //合法
const int j; //非法,导致编译错误
3. 在另一连接文件中引用const常量
extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次赋值
4. 便于进行类型检查
用const方法可以使编译器对处理内容有更多了解。
#define I=10
const long &i=10; /*dapingguo提醒:由于编译器的优化,使得在const long i=10; 时i不被分配内存,而是已10直接代入以后的引用中,以致在以后的代码中没有错误,为达到说教效果,特别地用&i明确地给出了i的内存分配。不过一旦你关闭所有优化措施,即使const long i=10;也会引起后面的编译错误。*/ char h=I; //没有错
char h=i; //编译警告,可能由于数的截短带来错误赋值。
5. 可以避免不必要的内存分配
#define STRING "abcdefghijklmn\n"
const char string[]="abcdefghijklm\n";
...
printf(STRING); //为STRING分配了第一次内存
C语言中const关键字用法总结
C++语言中const关键字用法总结
一、const是什么
在C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“只读”的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。
所以,const修饰符的作用主要是利用编译器帮助我们检查自己代码的正确性。我们使用con st在源码中标示出“不应该改变”的地方,然后利用编译器,帮助我们检查这些地方是否真的没有被改变过。如果我们不小心去修改了这些地方,编译器就会报错,从而帮助我们纠正错误。使用const和不使用cons t,对于最终编译产生的代码并没有影响。
虽然const对于最终代码没有影响,但是尽可能使用const,将帮助我们避免很多错误,提高程序正确率。
二、const可以修饰哪些对象
在上面已经提到过了,const是一种修饰符,那它可以作为哪些对象的修饰符呢?下面列举了一些C/C++中用到cons t的地方。
1,const变量
2,const指针
3,const引用
4,const类
5,类的const成员变量
6,类的const成员函数
7,const修饰函数的形参与返回值
下面我们分别讨论上面几种情况下,const的用法。
三、const与变量
const用法总结
const⽤法总结
1. const修饰变量
int b = 100;
const int* a = &b; //情况1
int const* a = &b; //情况2
int* const a = &b; //情况3
const int* const a = &b; //情况4
const修饰有三种情况:
第⼀:const在“ * ”左边,则const⽤来修饰指针所指向的变量,即指针指向为常量,如情况1,情况2;
第⼆:const在“ * ”右边,则const⽤来修饰指针本⾝,即指针本⾝是常量,如情况3;
第三:const在“ * ”两边,则const既修饰指针本⾝也修饰指针所指变量,如情况4;
注意:const的相对位置只与“ * ”有关,和变量的类型声明没有位置关系,其次const修饰指针所指变量时可以不初始化,但const修饰指针本⾝时必须初始化。
2. const在函数中的使⽤
2.1 const修饰函数的参数
输⼊参数采⽤“指针传递”,那么加const修饰可以防⽌意外的改动该指针指向的内存单元,起到保护作⽤,如StringCopy函数
//输⼊参数: strSrc 输出参数:strDest
void StringCopy(char* strDest, const char* strSrc);
如果还想保护指针本⾝,则可以声明指针本⾝为常量,例如:
void OutputString(const char* const pStr);
如果参数⽤于输出,不论它是什么类型,也不论它采⽤“指针传递”还是“引⽤传递”,都不能加const修饰,即const只能修饰输⼊参数。另外如果如果输⼊参数采⽤“值传递”,由于函数将⾃动⽤实参的拷贝初始化形参,因此即使在函数内部修改了该参数,改变的也只是堆栈上的拷贝⽽不是实参,所以⼀般不需要const修饰。最好不要把void Func(const int x)改为void Func(const int &x)这样即达不到提⾼效率的⽬的有让⼈费解。因为基本数据类型的参数不存在构造、析构的过程,除基本类型参数为推荐使⽤“const &传递”。
在C语言中const作用的的全面总结
在C语言中const作用的的全面总结
const 是一个关键字,用于声明一个常量。在C语言中,const 的作
用主要有以下几个方面:
1. 声明常量:const 用于声明一个常量,即一个不可修改的值。常
量的值在声明后不能被修改。例如:const int MAX_SIZE = 100; 声明了
一个名为 MAX_SIZE 的常量,其值为 100,不能被修改。
2. 防止意外修改:通过使用 const 关键字,可以防止在程序中意外
地修改一个变量的值。当一个变量被声明为 const 类型时,任何试图修
改其值的操作都会导致编译错误。
3. 优化编译器:const 可以用于给编译器提供有关变量值的信息,
从而优化生成的代码。编译器可以根据 const 的声明来进行一些优化,
例如将常量值直接嵌入到代码中,而不是每次都去访问内存。
4. 类型检查:const 可以提供类型检查,防止将一个类型错误的值
赋给一个变量。当一个变量被声明为 const 类型时,任何试图将不兼容
的值赋给该变量的操作都会导致编译错误。
5. 作用域:const 变量的作用域和普通变量一样,可以是全局的也
可以是局部的。在不同的作用域中可以使用相同的 const 变量名,它们
不会相互干扰。
6. 常量指针:const 还可以用于声明指向常量的指针。这意味着指
针指向的值是不可修改的,但指针本身可以修改。例如:const int *ptr; 声明了一个指向常量的指针,即不能通过 ptr 修改指向的值,但可以修
改 ptr 指向的位置。
7. 常量参数:const 可以用于声明函数的参数为常量参数,这样可以确保函数内部不会修改参数的值。这样的函数被称为常量函数,可以接受常量参数并返回常量结果。
CPP中的CONST总结
C++中const总结
对于基本声明
1. const int r=100; //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换
2. extend const int r=100; //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义
3. const int r[ ]={1,2,3,4};
struct S {int a,b;};
const S s[ ]={(1,2),(3.4)}; //以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式
对于指针
1. const int *r=&x; //声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量
2. int const *r=&x; //与用法1完全等价,没有任何区别
3. int * const r=&x; //声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改
4. const int * const r=&x; //综合1、3用法,r是一个指向常量的常量型指针
对于类型检查
可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:const int r=100;
const的数组
const的数组
一、什么是const的数组
1.1 const的含义
const是C++语言中的一个关键字,意为常量,表示该变量的值不可被修改。
1.2 const数组的含义
const数组即为声明为const类型的数组,其元素值不可被修改。
二、const数组的定义和初始化方法
2.1 定义方法
const类型数组可以通过以下方式定义:
const int arr[5] = {1, 2, 3, 4, 5};
其中arr为数组名,5为数组大小,{1, 2, 3, 4, 5}为初始化列表。2.2 初始化方法
常见的初始化方法有以下几种:
(1)直接赋值法:
const int arr[5] = {1, 2, 3, 4, 5};
(2)循环赋值法:
for(int i=0;i<5;i++){
cin>>arr[i];
}
(3)字符串转换法:
string s = "12345";
for(int i=0;i<5;i++){
arr[i] = s[i] - '0';
}
三、使用注意事项
3.1 数组元素不可被修改
由于声明为const类型的数组元素值不可被修改,因此在程序中不能对其进行赋值操作。否则会导致编译错误。
3.2 可以使用指针访问元素
虽然不能对元素进行修改,但可以通过指针访问元素。例如:const int arr[5] = {1, 2, 3, 4, 5};
const int *p = arr;
cout<<*p<<endl; //输出1
3.3 可以使用const_cast进行类型转换
C语言中const,volatile,restrict的用法总结
C语⾔中const,volatile,restrict的⽤法总结
变量声明中带有关键词const,,这是显⽽易见的⼀点。指针使⽤const则要稍微复杂点,因为不得不把让指针本⾝成为const 和指针指向的值成为const区别开来、下⾯的声明表⽰pf指向的值必须是不变的
constfloat *pf;⽽pf则是可变的,它可以指向另外⼀个const或⾮const值;相反,下⾯的声明说明pf是不能改变的,⽽pf所指向的值则是可以改变的:
float* const pf;
最后,当然可以有既不能改变指针的值也不能改变指针指向的值的值的声明⽅式:
constfloat * const pf;
需要注意的是,还有第三种放置const关键字的⽅法:
float const * pf; //等价于constfloat * pf;
总结就是:⼀个位于*左边任意位置的const使得数据成为常量,⽽⼀个位于*右边的const使得指针本⾝成为const
还要注意的⼀点是关于const在全局数据中的使⽤:
使⽤全局变量被认为是⼀个冒险的⽅法,它使得数据在程序的任何部分都可以被错误地修改,如果数据是const,那么这种担⼼就是多余的了不是嘛?因此对全局数据使⽤const是合理的。
然⽽,在⽂件之间共享const数据要格外⼩⼼,有两个策略可以使⽤。⼀个是遵循外部变量的惯⽤规则,在⼀个⽂件进⾏定义声明,在其他⽂件进⾏引⽤声明(使⽤关键字extern)。
/*file1.c------定义⼀些全局常量*/
const double PI = 3.14159;
const用法总结
赵英良
❝const int N=100;
❝const double pai=3.1415926;
❝N=1;X
❝pai=3.14;X
❝cout<
❝double const pai=3.1415926;
❝int a=3;
❝const int b=5;
❝const int&c=a; V ❝const int&d=b;V ❝a=10; V ❝c=11; X ❝int&e=b;X
❝const char *pContent;
❝常内容
◦char s1[100],s2[100];
◦const char *pContent=s1;
◦pContent=s2; V
◦pContent[0]='a'; *pContent='a'; X ❝const (char) *pContent;
❝char * const pContent;❝pContent是常量
❝常指针
◦char s1[100],s2[100];
◦char * const pContent=s1;◦*pContent='a'; V
◦pContent=s2; X
❝等价写法
◦(char*) const pContent;
◦const(char*) pContent;
❝const char* const pContent;❝For Example
char s1[100]="1234",s2[100]; const char* const pContent=s1; s1[0]='a'; s2[0]='1'; V pContent[0]='x'; X pContent=s2;X
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文档含有三部分
第一部分 const的用法,特别是用在函数后面(第1-4页)
第二部分 C++的那点事,const,指针和引用的混合使用(第5-9页)
第三部分 const 总结(第10-13页)
const的用法,特别是用在函数后面
在普通的非const成员函数中,this的类型是一个指向类类型的const指针(第 4.2.5 节)。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。
关键字:Const,Const函数,Const变量,函数后面的Const
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。
const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。
1.用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
问题是如此的缠绵,我只好将“const &”修饰输入参数的用法总结一下。
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
2 用const 修饰函数的返回值
如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
例如不要把函数int GetInt(void) 写成const int GetInt(void)。
同理不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。
如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A &
GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象
a =
b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。
3 const 成员函数
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。编译器将指