宏#define
宏的本质:替换而已。eg. #define PI 3.1415
宏与const在定义常量时的区别:前者只是把常量替换到源文件中,因此编译调试时会出现具体的数字而宏的名称不会出现在符号表中容易给调试带来麻烦;而后者不会有此问题
typedef
typedef定义类型的别名。eg. typedef int* p; typedef int (*PFUNC)(int, char); //定义函数指针类型PFUNC,用法:PFUNC p1, p2;
const
const的作用:const所修饰的变量具有不可修改性
1. const代替#define定义常量更好 const int PI = 3.1415;
2. 使用const常量注意的几点:
const int p = 2; //声明整型常量并赋初值为 1
const Teacher teacher; //声明Tercher类型的常量对象
const int* p; //指针所指向的变量不能修改,也就是一个常量,但指针可以修改
int const* p; //意义同上
int* const p = &number; //指针不能修改
const int* const p = &number; //指针和指针所指的变量都不能修改
区分上述方法:以
“ * ” 为界 ,把声明语句分割成两个部分:如果const在
“ * ” 的左边,则表示const修饰的是指针所指的变量,指针所指的变量不能修改,但指针是可变的;如果const在
“ * ” 的右边,则表示const修饰的是指针,这个指针的值不能在声明后修改,所以在声明时必须赋初值,而指针所指向的int变量值是可以改变的。
3. 经const修饰后的变量作函数参数:表示该变量只是作为一个传入参数,在整个函数内部不能被修改
#include <iostream>
using namespace std;
int add(const int a, int& b) //a传入参数:被const修饰,整个add函数内部都不能修改a,它只作为函数的传入参数
//b传出参数:可以修改
{
b = 5;
return a + b;
}
int main()
{
int a = 2;
int b = 3;
cout<<add(a, b)<<endl;
return 0;
}
/* output: 7*/
4. const修饰类成员函数
在类成员函数的末尾加const修饰,表示在这个成员函数内不得改变该对象的任何数据。这种模式常用来表示'对象数据只读'的访问模式,也就是说,这是一个只读的成员函数,是一个查看函数。
#include <iostream>
using namespace std;
class constDemo
{
public:
char getValue(int index) const
{
//m_data[3] = 'A'; //error!const成员函数内不能修改对象的任何数据! 只能只读
return m_data[index];
}
void show()
{
}
private:
char m_data[3] = {'a', 'b', 'c'};
};
int main()
{
constDemo demo;
cout<<demo.getValue(2)<<endl;
return 0;
}
/* output: c */