C++ Primer 第二章笔记

1. char 类型分为signed char ,unsigned char,具体表示根据编译器决定,因此不要用char类型进行算术运算,除非明确指定类型

2. long 的字节长度不低于int,但部分操作系统中long的表示范围与int一致,因此,如果太大的数值,可以直接用long long表示。如果明确数值大小,尽量使用int32_t,int64_t明确大小。

3.当我们赋给无符号类型一个超过它表示范围的值时,结果是初始值对无符号类型表示数值总和取模后的余数;当我们赋给有符号类型一个超过它表示范围的值是数值时,表示数值为 undfined

#include <iostream>

int main(){
    uint8_t c1 = -1;
    uint8_t c11 = 257;
    unsigned char c2 = -1000;
    signed char c3 = 256;
    std::cout << "c1: " << int(c1) << " || c11: " << int(c11) << " || C2: " << int(c2) << " || c3: "<< int(c3) << std::endl;
    return 0;
}

结果为:c1: 255 || c11: 1 || C2: 24 || c3: 0

无符号的数值为 数值 % 256,需要注意负数取模是向-∞靠近

4. 如果使用初始化列表,且初始值列表存在丢失的风险,那么编译器将报错

5. 如果内置类型的变量未被显示的初始化,它的值由定义的位置决定,定义于任何函数体之外的变量被初始化为0,有一种例外情况,就是定义在函数内部的内置类型将不被初始化,一个未被初始化的内置变量的值是未定义的,试图拷贝或者访问这个变量会发生未定义的行为。

#include <iostream>

class Data_{
    public:
        int data;
};

void print(){
    int print_data;
    std::cout << "print_data:" <<print_data << std::endl; 
}

int main(){
    int data;
    Data_ data2;
    std::cout << "data:" << data << " || Data.data: " << data2.data <<std::endl;
    print();

}

输出结果如下:

data:0 || Data.data: 0
print_data:32715

从实验结果看出,类里面,主函数里面的值进行了默认初始化,但是在函数内的数值就没有初始化,产生了未定义的行为。

6. 如果想要声明一个变量,而非定义一个变量,需要在变量前添加关键字extern。注意,此时函数体内不再允许初始化赋值。

7. 变量仅能被定义一次,但可以被声明多次

8. 默认状态下,const对象仅在文件内有效,也就是内部链接性,仅在定义的源码文件内能够访问,除非添加extern关键字,如下所示

// file.h
extern const int DATA = 1;

// file.cpp
#include file.h
// 声明const变量,能够全局使用
extern const int DATA

9. 试图让一个非常量的引用指向一个常量对象,这是错误的;常量引用有点像是

const int* const p;

另外常量引用,支持字面量初始化

10. 直接修饰的顶层const没有拷贝限制

11. 当你认为变量是一个常量表达式是,使用constexpr声明表示,增加常量检查机制

12. constexpr 在声明中如果定义了一个指针,那么这指针是一个常量指针,也就是说,这个指针指向的数据不能改变。

13.假如 i是int类型的数据,decltype(i=c)返回的数值时int&,这是因为赋值函数返回的是i的引用,避免了数据拷贝;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值