C++学习笔记 第三章 对象与基本类型

1 从初始化和赋值类型谈起

初始化/赋值语句:将某个值与一个对象关联起来

- 值:字面值、对象所表示的值

- 标识符:变量、常量、引用

- 初始化基本操作:在内存中开辟空间,保存相应的数值。在编译器中构造符号表,将标识符与相关空间关联起来

- 值与对象都有类型

- 初始化/赋值可能涉及类型转换

2 类型详述

类型描述了

- 存储所需要的尺寸 int 4个字节 char 1个字节 但是并没有严格限制

- 取值空间 超过范围可能产生溢出 上溢出变最小值,下溢出变最大值

- 对齐信息:char是1,int是4

- 操作

基本类型

数值类型:字符类型(char,wchar_t,char16_t,char32_t)、整数类型(带符号,shot,int,long,long long。无符号:unsigned+带符号整数类型)、浮点类型(float,double,long double)、void

复杂类型

由基本类型组合、变种所产生的类型,可能是标准库引入或自定义类型

与类型相关的标准未定义部分

- char是否有符号

- 整数中内存中保存的方法:大端 小端

- 每种类型的大小(间接影响取值范围 )

字面值及其类型

- 整数字面值: 20,024,0x14。十进制,八进制,十六进制

- 浮点数:1.3,1e8 - double型

- 字符字面值: 'c','/n','/x4d' - char型

- 字符串字面值: "Hello" - char[6] 型

- 布尔字面值: true,false - bool 型

- 指针字面值:nullptr - nullptr_t 型 

变量及其类型

变量:对应了一段存储空间,可以改变其中内容

变量的类型在其首次申明(定义)时指定:

- int x:定义一个变量x,其类型为int

- 变量申明与定义的区别:extern 前缀

变量的初始化与赋值

- 初始化:在构造变量之初为其赋予的初始值 缺省初始化(int x,在函数中是任意值,全局变量赋予0)、直接/拷贝初始化、其他初始化

- 赋值:修改变量所保存的数值

3 复合类型:从指针到引用

指针:一种间接类型

指针同样是开辟一段空间,保存对象对应内存的首地址。指针的空间本身也有编号。

特点

- 可以指向不同的对象

int main()
{
    int x = 42;
    int y = 56;
    int* p = &x;
    
    p = &y;
}

- 具有相同的尺寸

相关操作

- &-取地址操作符

- *-解引用操作符

int main()
{
    int x = 42;
    int* p = &x;
    cout<< *p <

尽管指针具有相同的尺寸,但是解引用操作符时候会根据指针的类型去解引用

缺省初始化指针时一般不解引用,因此一般需要在初始化时赋值 

指针的定义:nullptr,表示空指针,因此初始化时可以写int* = nullptr;

指针与bool的隐式转换:非空为true,空为false 

指针加1、指针减1:按照指针类型往后或者往前类型大小的字节

比较大小:一般在数组内部比较

void* 指针

- 没有记录对象的尺寸信息,可以保存任意地址。可以跟任何指针做转换

- 支持判等操作

指针的指针: int** pp = &p

指针vs对象:指针复制成本低,读写成本高 

引用

int main()
{
    int x = 3;
    int& ref = x;//申明类型:引用。相当于给x加了个别名
}

在构造的时候绑定对象,在生命周期不能改变。 

指针也是对象,因此可以定义引用。

int main()
{
    int x = 3;
    int* ptr = &x;
    
    int*& ref = ptr;
}

从右到左来看是指针还是引用,最近的是什么就是什么。

不能构造引用的引用。引用不是一个对象

4 常量类型和常量表达式

常量与变量相对,表示不可修改的对象

- 使用const申明常量对象

- 是编译期概念,编译器利用其防止非法操作、优化程序逻辑

常量指针与顶层常量

- const int* p;不能使用p改变指针的值

- int* const p;指的是指针不能修改

区别在于const和*的相对位置

- const int* const p;

- 常量指针可以指向变量 

常量引用(也可绑定变量)

- const int&

- 可读但不可写

- 主要用于函数形参

- 可以绑定字面值

常量表达式

- 使用constexpr声明 

- 申明的是编译器常量

- 编译器可以利用其进行优化

- 常量表达式指针: constexpr 位于 *左侧,但表示指针是常量表达式

5 类型别名与类型的自动推导

类型别名

可以为类型引入别名,从而引入特殊的含义或便于使用 typedef int MyInt 或者 using MyInt = int

使用using引入类型别名更好

typedef char MyCharArr[4]

using MyCharArr = char[4]

类型的自动推导

 auto 编译器自动推导,会产生类型退化(定义的变量放在后边作为右值的时候会产生类型退化

const auto/constexpr auto:推导出的是常量/常量表达式

auto&: 推导出引用类型,防止类型退化

6 域与对象的生命周期

域(scope)表示了程序中的一部分,其中的名称有唯一的含义

全局域:程序最外围的域。对象的生命周期是整个程序的运行区间

块域:用大括号限定的域。


你可能感兴趣的:(学习,c++)