C++对c的拓展之, 引用和const关键字

bool类型关键字

C++中的布尔类型

C++C语言的基本类型系统之上增加了bool

C++中的bool可取的值只有truefalse

理论上bool只占用一个字节,

如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现

true代表真值,编译器内部用1来表示

false代表非真值,编译器内部用0来表示

 

#include <iostream>
using namespace std;

int main()
{
    bool b1 = true; // 告诉c++编译器给我分配一个字节内存
    cout << sizeof(b1) << endl;
    // bool 只有真或者假(0或非0) true或false
    b1 = 10;
    cout << b1 << endl; // 还是为1
    return 0;
}
结果:
1
1

 

三目运算符

三目运算符在C语言中是右值,右值不可以被赋值。但在C++中,三目运算符是左值,左值可以赋值。

左值和右值:

左值:可以放在赋值操作符左边的是左值,左值为Lvalue,L代表location,表示内存可以寻址,可以赋值。

右值:右值为Rvalue,R代表read,不可以被赋值。

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int b = 20;
//    a > b ? a : b = 100;    // 在c++中三目运算可以当左值, 思考在c语言中如何实现的
    // 实现方式: *(a > b ? &a : &b) = 100;
    a > b ? a : b = 100;
    cout << a << " " << b << endl;
    return 0;
}

三目运算符在c语言中如何实现当左值

#include <stdio.h>

int main()
{
    int a = 10;
    int b = 20;
    *(a > b ? &a: &b) = 100;
    printf("a = %d, b = %d ", a, b);
    return 0;
}

// 结果
a = 10, b = 100 

可以看出,c++编译器帮我们做了一个&

 

const关键字

const int a = 10;
int const b = 20;

这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了,而且编译器也不允许不赋初值的写法

    const int a;
    int const b;  // a和b都是不可以修改的

    const int *c;  // 常量指针, c是本身可以修改, 但是他指向的值不可以修改
    int * const d; // 指针常量: d这个指针本身是一个常量不可以修改,但是他指向的值可以修改
    const int * const e ;// 指针e本身和他指向的值都不可以修改
#include <iostream>
using namespace std;

int main()
{
    const int a = 1;
    int const b = 2; //这两个一样

    int i  = 0;
    int *const p1 = &i;  // 不能改变p1的值,这是一个顶层const
    const int ci = 42; // 不允许改变ci的值,这是一个顶层const
    const int *p2 = &ci;  // 不允许改变p2的值,这是一个底层const
    const int *const p3 = p2; // 靠右的const是顶层const,靠左的是底层const
    const int &r = ci; // 用于声明引用的const 都是底层const
    // const int *const e
    // 顶层const:表示指针本身是个常量
    // 底层const:表示指针所指对象是一个常量


    // c语言中const是个“冒牌货”,下面的代码在c文件下可以修改t的值
    // c++中const是一个真正的常量
    // 造成这样原因是:c++编译器对const进行了拓展

    const int t = 10;
    int *p = NULL;
    p = (int*)&t;
    *p = 20;
    cout << t; // 还是10
    // 但是*p是20
}
const例子

相关文章: