以下内容参考自《程序员面试宝典》一指针常量 常量指针关于const修饰指针的情况可以分为以下4种情况int b 1; const int* a b; // case 1 int const *a b; // case 2 int* const a b; // case 3 const int* const a b; // case 4如果const位于星号的左侧则const就是用来修饰指针所指向的变量即指针指向为常量指针常量e.g. case 1和case 2如果const位于星号的右侧则const就是修饰指针本身即指针本身是常量常量指针e.g. case 3。对于指针常量我们不允许对指针指向地址的内容进行更改。e.g.int b 1; const int* a b; *a 0; // error但是可以通过其他方式来修改*a的值1通过改变b的值int b 1; const int* a b; b 0; cout *a endl; // 02使a指向另一处地址int b 1; const int* a b; int c 0; a c; cout *a endl; // 0对于指针常量可以先不进行初始化。因为虽然指针内容是常量但是指针本身不是常量。e.g.const int* a; // 编译通过对于常量指针我们不能使指针指向另一处地址因为指针本身是一个常量也正因如此在定义时就需要初始化。e.g.int b 1; int* const a; // error需要初始化 int* const a b; *a 0; // 编译通过允许对指向地址的值就行修改 cout a endl; // error不允许对指向的地址进行修改对于case 4则是严格要求指针和指针指向地址的值都是常量那么就是只能作为右值了。二const成员函数为了使成员函数的意义更加清楚我们可以在不改变对象的成员函数的函数原型中加上const。e.g.class A{ private: int a; public: int getA() const; }; // 关键字const必须在函数声明与函数实现中保持一致否则编译器会把它们看成不同的函数 int A::getA() const{ return a; }如果const成员函数中试图修改成员变量或者调用另一个非const成员函数编译器将会报错cannot assign to non-static data member within const member function getA。但是对于静态变量不过要注意静态变量一定要初始化或者是带有mutable关键字修饰的成员变量则是可以编译通过的。e.g.class A{ private: int a; static int b; mutable int c; public: int getA() const; }; int A::b 0; // 关键字const必须在函数声明与函数实现中保持一致否则编译器会把它们看成不同的函数 int A::getA() const{ b; c--; return a; }如果把const放在函数声明的前面那么就意味着函数的返回值是常量意义就完全不同了。三const #defineC可以用const定义常量也可以用#define定义常量但是前者比后者有更多的优点const常量有数据类型而宏定义常量没有数据类型。编译器可以对前者进行类型安全检查而对后者只进行字符替换没有类型安全检查并且在字符替换中可能会产生意料不到的错误边际效应——由于边缘运算符优先级较高而先对边缘进行运算。有些集成化的调试工具可以对const常量进行调试但是不能对宏定义常量进行调试。
郑州网站建设
网页设计
企业官网