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