在c++中用const修饰常量来替换#define定义的宏
1.C++中应避免使用#define,因#define没有作用域的概念,因此会破坏C++的封装性;
2.另一方面,预处理器会在编译前将替换#define定义的常量,程序中没有了定义的标识符,会影响debug或crash问题的查找;
3.另外被常量值替换了的常量出现在多处,就可能在多个位置存储,增加程序体积。C++中可使用const代替#define,避免上述问题
作者:13261118477
链接:https://www.jianshu.com/p/6b06f2d5032d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
const修饰
1.修饰成员变量
1.在 (构造函数)使用参数列表初始化
2.可以直接在类内部初始化
3. static const int number = 123 可以直接在类内部和外部初始化,不能使用参数列表初始化
2.修饰成员函数
格式:在函数参数()后面添加const
const修饰的成员函数是不能修改成员变量(不能调用非const修饰的成员函数)
3.修饰类的对象
const 修饰的对象只能调用const修饰的成员方法
特殊的常量引用:
如 const int& count = 7;
当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
#include <iostream>
#include <string>
using namespace std;
namespace namespaceTest {
#define HEIGHT 4 //宏没有作用域概念
}
class Person {
public:
enum class L :int {
RED = 9,
BLUE = 10,
};
static const int ArrayNum = 5;//可以类内初始化,也可以类外。不能使用参数列表
const int const_test;//可以类内初始化,不可以类外。可以使用参数列表。c++ primer上说只能用参数列表初始化
Person(int age, string name = "david");
void show() {
cout << "name:"<<this->name.c_str() << endl;
cout << "age:" << this->age << endl;
cout << "L:" <<static_cast<int>(L::BLUE)<< endl;
}
void show(L a) {
cout << "L:" << static_cast<int>(a) << endl;
}
void show() const {
cout << "ArrayNum:" << static_cast<int>(ArrayNum) << endl;
cout << "const_test:" << static_cast<int>(const_test) << endl;
}
private:
int age;
string name;
};
Person::Person(int age, string name ) :age(age), name(name), const_test(16){
}
/*声明或定义处都可以使用默认参数,
但无论这个函数有多少个函数声明和定义,每个参数只能在一处声明或定义使用默认值
否则会被认为重复定义默认参数,编译出错
*/
void tirangle_area(const int &h=8, int a=7);
void tirangle_area(const int& h, int a) {
cout << "triangle area:" << a * h / 2 << endl;
}
const int global = 1;
int main()
{
int test = global;
std::cout << global<< std::endl;
//Person a(26);
const Person a(26);
a.show(); //const 对象调用const方法
// a.show(Person::L::BLUE);
tirangle_area(HEIGHT,6);//可以直接使用 namespace里面的HEIGHT宏
/*常量引用:
当使用常量(字面量)对const引用进行初始化时,
C++编译器会为常量值分配空间,
并将引用名作为这段空间的别名
*/
const int& count = 7;
std::cout <<"count:" <<count << std::endl;
return 0;
}
输出结果:

代码中用到了 默认参数:
参数声明或定义处都可以使用默认参数,
但无论这个函数有多少个函数声明和定义,每个参数只能在一处声明或定义使用默认值
否则会被认为重复定义默认参数,编译出错
当然你也可以像下面这用声明和定义 使用默认参数。 但如果真的这样做,代码阅读性就会非常差,小心被老板扣工资!
void tirangle_area(const int &h=8, int a);
void tirangle_area(const int &h, int a=7);
void tirangle_area(const int& h, int a) {
cout << "triangle area:" << a * h / 2 << endl;
}
1764

被折叠的 条评论
为什么被折叠?



