首先是关于常量的设定
c++推荐的是用const来定义常量,或者是用枚举
传统的c一般是利用#define来定义常量的,当然,也可以使用const
例如:
c++的风格:
const int LIMIT = 10;
enmu{LIMIT = 10};
const static int LIMIT = 10;
传统C的风格:
#define LIMIT 10
这个没什么好解释的
——————————————————————————————————————————————————
然后是关于inline 和 #define来定义短小的内链函数
看例子:
c++风格:
inline getcir(int length,int width)
{
return (2*length+2*width);
}
传统C的风格:
#define getcir(x,y) (x*2+y*2)
// 一些比较长的内联函数不得不采用"/"来换行输入
这2者的第一个区别就是,用#define的时候,一定记得要加括号,因为#define是预处理命令
他是文本替换,以上例来说如果调用宏后面的运算优先级高于“+”那么后果大家都知道
而且用宏来调试程序的时候很累,特别是语法错误,因为他显示的是替换后的语句
——————————————————————————————————————————————————
最后是关于const的一些使用规则
1.const int i = 0 与 int const i = 0 是等效的
2.const常量定义的时候必须初始化,也就是说不能 const int i; i = 10;
3.const与指针变量的组合
int temp = 0;
const int * i = &temp; // 等效 int const * i =&temp;
与
int * const i = &temp;
前一句限定的是 *i 的内容,也就是说,指针指向的地址中的内容不可变
第二句限定的是 i 的内容,也就是说,指针指向的地址不可变
也就是说,前一句是对接触引用操作符*的常量化
后一句是对指针本身的常量化
再通俗一点,指针是个变量,他里面存放的是一个地址,这个地址就是指针变量的值了
而这个地址指向的值就是对指针解除引用的值了 也就是 *i
前一句是对指针存放的地址对应的值的常量化
而后一句是对指针存放的这个变量的常量化
也就是说,对于第一句: i = new int ; 是合法的,但是不能 *i = 3;
对于第二句: i = new int; 是非法的,但是可以 *i = 3;
应该解释清楚了吧,再不清楚的,我也没办法了。
——————————————————————————————————————————————————
然后是关于const用于函数参数
如果一个函数的参数是const类型
比如天天用的 char * strcpy(char *dest,const char *src); 函数
这个函数代表着*src是不可改变的,如果函数中有试图改变*src的行为,编译器将报错
B.T.W :const修饰的形参可以被赋予非const修饰的实参
但是被const修饰的实参,是不能赋予非const修饰的形参的,除非这个函数本身被const限定
那么什么叫做函数本身被const限定呢,这个就要牵扯到类的成员函数了
如果一个类的成员函数被const限定,那么代表着这个成员函数不会改变类的成员的值
例如:
class test{
private:
int x,y;
public:
void show() const;
};
void test::show() const
{
std::cout<<x<<y<<std::endl;
}
也就是说,函数test::show()不会改变类成员变量的值,也就可以接受一个形如 const test t 的对象了
如果test::show()的声明中没有const,那么将不能对const test t调用test::show()函数,因为编译器无法保证函数不会修改对象t的值