const关键字

    xiaoxiao2021-04-13  24

    1.const定义常量(和#define)的区别:

    const int a=10;发生时机:编译,它就会有语法检查,如果定义常量,推荐使用

    #define a 10发生时机:预处理,只是一个简单的字符串替换(宏出错的话并不能意识到已经发生了错误)

    2.const 修饰指针的两种形式:

    常量指针(pionter to const):

    const int *pa=&b; *pa=110;//Error 指针所指向的变量是不能修改的 pa=&c;//可以修改其指向指针常量(cosnt pointer)

    int * const pa =&b; *pa=110;//指针可以修改其指向的值 pa=&c;//指针本身的值不能被修改可以用来保护被修饰的东西,增强程序的健壮性

    3.const成员函数:把const  放在函数的参数体和函数体中。

       它的特点有两个,一个是只能读取数据成员而不能修改它,另一个是只能调用const成员函数,而不能调用非const成员函数

       其基本格式为:类内定义时:

         类型  函数名(参数列表)const

         {

                 函数体;

         }

         类外定义时:

         类型  类名::函数名(参数列表)const

        {

                 函数体;

        }

        

    #include <iostream> using namespace std; class point { int x; //默认为private的数据成员x和y int y; public: point(int xp = 0, int yp = 0) //构造函数 { x = xp; y = yp; } void print() const //const成员函数内无法修改数据成员,否则编译器报错 { x = 5; //1. 试图修改x将引发编译器报错 set(); //2. 试图调用非const函数将引发编译器报错 cout << "x: " << x << " ,y: " << y << endl; } void set() //将set()定义成const函数就能解决问题 { } }; int main() { point pt; //声明类对象,以缺省参数形式调用构造函数 pt.print(); //调用const成员函数 return 0; }

    c++类常量无法调用非const成员函数,若想调用,则必须在成员函数上加上const

    #include<iostream> using namespace std; class A { private: int x; int y; public: void print() { // 必须加上const ,否则a无法调用 cout <<x<< endl; } }; int main() { const A a; a.print();//a是无法调用非const成员函数 return 0; }

    在const成员函数中不允许修改对象的数据,也不允许调用非const成员函数(因为这样会间接的修改对象的数据,所以被C++封了),这样的函数是如下声明的:

    class A { int function(int para) const; //我们看到的const成员函数 int function(const A *this, int para) //编译器的const成员函数 }

    所以一个类的尾后const成员函数如果返回*this,那么其返回类型必然是 const 类名 & 前面这个const是不能少的.否则无法通过编译

    class B { public:int v; //B &get() const 这样声明是错误的 const B &get() const { //const成员函数返回*this必须是const的引用 return *this; } };

    4.修饰类成员变量

    用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。

    #include <iostream> using std::cout; using std::endl; class Point { public: explicit Point(int ix = 0, int iy = 0) : _ix(ix) //对于const数据成员,只能初始化列表之中进行 , _iy(iy) { cout << "Point(int,int)" << endl; //_ix = ix;这样为赋值,报错 //_iy = iy; } void print() { cout << "(" << _ix << "," << _iy << ")" << endl; } private: const int _ix; const int _iy; }; int main(void) { Point pt(1, 2); pt.print(); }

    转载请注明原文地址: https://ju.6miu.com/read-668589.html

    最新回复(0)