标签:类的成员 一个 情况下 外连接 符号 不能 通过 pre ufs
const修饰变量,以下两种定义形式:
TYPE const ValueName = value;
const TYPE ValueName = value;
它的含义是:const修饰的类型为TYPE的变量value是不可变的。
const修饰指针,涉及到两个很重要的概念,顶层const和底层const
指针自身是一个对象,它的值为一个整数,表明指向对象的内存地址。进而,指针本身是否是常量以及所指向的对象是否是常量就是两个独立的问题。
顶层const(top-level const): 指针本身是个常量;
底层const(low-level const): 指针指向对象是一个常量;
char* const pContent;
const char *pContent;
const char* const pContent;
如果const位于*
的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
void function(const int Var);
void function(const char* Var);
void function(char* const Var);
void function(const TYPE& Var);
const int fun1()
这个其实无意义,因为参数返回本身就是赋值。
const int * fun2()
调用时const int *pValue = fun2();
我们可以把fun2()
看作成一个变量,即指针内容不可变。
int* const fun3()
调用时int * const pValue = fun2();
我们可以把fun2()
看作成一个变量,即指针本身不可变。
一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。
const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
const修饰类的成员函数,一般写在函数的最后来修饰。
class A
{
void func1();
void func2() const;
}
const A aObj;
aObj.func1(); //错误
aObj.func2(); //正确
const A* aObj = new A();
aObj-> func1(); //错误
aObj-> func2(); //正确
const_cast <type_id> (expression)
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
C++中,const变量默认是内连接的。也就是说它只能在定义它的文件内部使用,链接时其它编译单元看不见它。若要改为外部连接,则需要使用extern声明。
C语言中的const默认为外链接。
const int bufsize = 100;
char buf[bufsize];
在C++中正确,编译期间可以知道bufsize的值,在C语言中不正确,编译期间并不知道bufsize的值。
const int size;
这种定义形式在C语言中是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间。
但在C++中这样写是不正确的,必须写成:
extern const int size
或者:
const int bufsize = 100;
编译是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来。
内外链接的区别就在于:编译期间是否能够交互。
内部连接:如果一个名称对于它的编译单元来说是局部的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接。
外部连接:在一个多文件程序中,如果一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。
标签:类的成员 一个 情况下 外连接 符号 不能 通过 pre ufs
原文地址:https://www.cnblogs.com/chay/p/10976888.html