C++ const修饰符

时间:2019-11-25
本文章向大家介绍C++ const修饰符,主要包括C++ const修饰符使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。



1、const常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。

const在类中可以先声明再在构造函数中初始化。
但在其他地方必须声明时就初始化。

class MyClass {
public:
    const int age;
    MyClass();
};
MyClass::MyClass() :age(20) {};

2、const与指针

指向常量的指针指针类型的常量

    int age = 20;
    int age2 = 30;
    const int* pt = &age;
    //这里pt是一个指向常量的指针。
    //但是并不是说age是常量,而是对pt而言,age是个常量。
    //可以修改age,也可以修改pt的值。不可通过pt修改age的值。
    *pt = 25;   //错误
    age = 25;   //正确
    pt = &age2; //正确


    int weight = 130;
    int weight2 = 140;
    int* const pt2 = &weight;  
    //这里pt2是一个指针类型的常量。
    //这种声明使得pt只能指向age。
    //可以修改weight,可以通过pt修改age的值。但是不能修改pt2。
    *pt2 = 230;      //正确
    weight = 230;    //正确
    pt2 = &weight2;  //错误

3、const与&

&引用不太懂的童鞋推荐一个博客 C++中的&
&它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。

举个栗子

一般写法
参数是一般变量:当调用Print函数时,会把实参的值拷贝一份,并分配内存给形参,把拷贝的值传递进去。我们在函数中使用的也是变量的复制品,并不会对传递进来的变量有影响。

参数是一般对象:不但会有上面的步骤,还会拷贝构造函数。


void Print(int age);

class MyClass {
public :
    int age;
    MyClass(int num);
};
MyClass::MyClass(int num)
{
    age = num;
}
void PrintClass(MyClass m);


int main()
{
    //一般类型
    int age = 20;
    Print(age);

    //对象类型
    MyClass m1(20);
    PrintClass(m1);

    return 0;
}

void Print(int age)
{
    cout << age << endl;
}

void PrintClass(MyClass m)
{
    cout << m.age << endl;
}

进阶写法
参数添加const和&:因为使用&声明一个引用并不会占据存储空间,只是给传递的变量声明一个别名。而我们并不需要修改传递变量的值,所以添加上const修饰符保证安全。

这样我们就很好的使用const和&的特性增加了程序的效率,节约了内存空间!!!

void Print(const int& age);

class MyClass {
public :
    int age;
    MyClass(int num);
};
MyClass::MyClass(int num)
{
    age = num;
}
void PrintClass(const MyClass& m);

int main()
{
    //一般类型
    int age = 20;
    Print(age);

    //对象类型
    MyClass m1(20);
    PrintClass(m1);

    return 0;
}

void Print(const int& age)
{
    cout << age << endl;
}

void PrintClass(const MyClass& m)
{
    cout << m.age << endl;
}

4、附件内容

4.1 const比#define的三个好处

  1. 可以明确指定类型。
  2. 可以使用C++的作用域规则将定义限制在特定的函数或文件中。???????
  3. 可以将const用于复杂的类型

4.2 C++中使用typedef代替C中#define的创建别名特性

在c++中创建别名用typedef,typedef创造别名比#define好,可以用于更复杂的类型别名。

原文地址:https://www.cnblogs.com/Fflyqaq/p/11925952.html