C++ const修饰

在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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值