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的三个好处
- 可以明确指定类型。
- 可以使用C++的作用域规则将定义限制在特定的函数或文件中。???????
- 可以将const用于复杂的类型
4.2 C++中使用typedef代替C中#define的创建别名特性
在c++中创建别名用typedef,typedef创造别名比#define好,可以用于更复杂的类型别名。