zoukankan      html  css  js  c++  java
  • 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 const *pt;
    
    
    	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;
    }
    

    使用const &做返回值时的一个坑
    假如我们现在想在字符串的左右加一些东西,我们在Test函数里面声明一个字符串并返回这个字符串。(这是错误的写法)

    temp是函数Test里面的一个临时变量,在函数运行完后就会释放。如果我们返回一个指向临时变量的引用,那么自然会报错。(程序试图引用已经释放的内存)

    const string& Test(const string& str1, const string& str2);
    
    int main()
    {
    	string str = "Hello";
    	string newStr = Test("Hello", "###");
    
    	return 0;
    }
    
    const string& Test(const string& str1, const string& str2) {
    	string temp;
    	temp = str2 + str1 + str2;
    	//返回一个指向临时变量的引用,会报错
    	return temp;
    }
    

    4、附件内容

    4.1 const比#define的三个好处

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

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

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

  • 相关阅读:
    Firemonkey绑定对象列表
    Firemonkey 自定义Button的Style
    Delphi中使用GDI+进行绘图(2)
    Delphi中使用GDI+进行绘图(1)
    很好用的一个类:TJvAppXMLFileStorage
    我的Win32开发抉择,Delphi老将复出
    实现动态的XML文件读写操作
    一个简单的统计图像主颜色的算法(C#源代码)
    开始使用THREE.JS
    C++应用程序在Windows下的编译、链接(一)概述
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11925952.html
Copyright © 2011-2022 走看看