【C++Primer---C++知识点记录I---开始变量和基本类型】

目录

 开始&一些Tips

基本内置类型

字面值常量

变量

复合类型

const限定符

处理类型


 开始&一些Tips

【IDE】(集成开发环境),把编译器与其他程序创建和分析工具包装在一起

<<输出运算符,右侧运算对象是要打印的值,这个运算符把给定的值写到ostream对象中。输入运算符的计算结果就是其左侧运算对象,即,运算结果就是我我们写入给定值的那个ostream对象

endl【操纵符】,写入endl的效果是结束当前行,并把与设备关联的缓冲区中的内容刷到设备中

读取数量不定的数据 while(cin>>e)

类定义了行为

有时测试程序会反复输入,这时候就可以使用文件重定向(待学)

点运算符只能用于类类型的对象

基本内置类型

C++类型决定了能对对象进行的操作,C++是一种静态数据类型语言,它的类型检查发生在编译时。因此,编译器必须知道程序中每一个变量对应的数据类型

char的空间要确保可以存放机器字符集中任意字符对应的数字值,因此一个char和一个机器字节一样大(8位)

*机器字长指的是CPU一次能 并行处理的二进制位数 ,字长总是8的整数倍,通常PC机的字长为16位(早期),32位,64位

计算机以比特序列存储数据,可寻址的最小内存块称为字节存储的基本单元称为字,通常由几个字节构成。

  左侧是字节的地址,右侧是字节中8bit的具体内容

类型决定了数据所占的比特数,以及如何解释这些bit的内容

字面值常量

每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型

字符串字面值的实际类型是由常量字符和/0构成的数组

true false是布尔类型的字面值

nullptr是指针类型的字面值

变量

列表初始化——采用花括号。当这种方式用于内置类型的变量时,如果我们用列表初始化且初始值存在丢失信息的风险,编译器将报错

默认初始化:如果定义变量时没有指定初值,就会被默认初始化。

如果是内置类型的变量,那么它的值由定义的位置决定。

  • 定义于任何函数体之外的变量都被初始化 0
  • 定义在函数体内部的内置类型变量将不会被初始化,这样的值是未定义的(试了一下,有这样的变量编译器会报错)

声明一个变量(不是定义),那么它不会申请存储空间,更不会给变量初始值

如果想声明而不是定义,就在前面加关键字extern

extern   还表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用

C++中extern关键字用法小结 - Broglie - 博客园 (cnblogs.com)

[标识符]就是dp,a,StudentAge之类的

复合类型

例如指针和引用(这里指的是左值引用)

引用不是对象,指针是对象

空指针不指向任何对象。得到空指针最直接的办法就是使用字面值nullptr来初始化指针。nullptr是一种特殊类型的字面值,它可以被转换成任意其他的指针类型。(应尽量使用nullptr)

void*指针是一种特殊的指针类型,可以存放任意对象的地址。不能直接操作void*指针所指的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。

指向指针的引用:引用不是对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用

const限定符

const对象一旦创建后其值就不能再改变,所以const对象必须初始化

默认状态下,const对象仅在文件中有效,但是,有时我们想要让const变量在文件间共享。这时候,我们不希望编译器为每个文件分别生成独立的变量,我们想要,只在一个文件中定义const,而在其他多个文件中声明并使用它。

解决办法:对于const变量,不管是声明还是定义,都添加extern关键字(刚刚记录了extern还有声明变量的功能),这样,就只需定义一次。

const的引用

可以把引用绑定到const对象上,这称为对常量的引用。对常量的引用不能被用作修改它所绑定的对象。

 同时也允许将const int&绑定到一个普通int对象上

总之,不能利用对常量的引用去修改值,也不能用非常量引用指向常量对象

指针和const

1.指向常量的指针

2.const指针

常量指针必须初始化,且一旦初始化完成,它的值就不能再改变了

 (不变的是指针本身的值而非指向的那个值)

3.顶层const和底层const

const int* p底层const,指向常量的指针
int * const p 顶层const常量指针

把离变量最近的那个东西 和 变量一起去掉,就看剩下的是啥,这个const就知道是啥

constexpr和常量表达式

常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。

字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式

constexpr变量: 

声明为constexpr的变量一定是一个常量,且必须用常量表达式初始化

 指针和引用都能定义成constexpr,但constexpr指针的初始值必须是nullptr或0或者是存储于某个固定地址中的对象(函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量。相反的。定义于所有函数体之外的对象地址固定不变,能用来初始化constexpr指针)

处理类型

类型别名

typedef double wages;    //wages是double的同义词

新标准规定了一种新的方法:使用 别名声明 来定义类型的别名;

using SI=Sales_Item;  SI是Sales_Item的同义词

用关键字using作为别名声明的开始

 auto类型说明符:让编译器替我们分析表达式所属的类型(编译器是通过初始值来推算的,因此auto定义的变量必须要有初始值)

auto一般会忽略掉顶层const

const int ci=i

auto b=ci //auto会忽略掉ci的顶层const特性

如果希望推断出的auto类型是一个顶层const,需要:const auto f=ci;

有时候,不需要表达式的值,只想要类型,因此C++11引入了类型指示符decltype

它的作用是选择并返回操作数的数据类型

例如:decltype( f() ) sum=x;

sum的类型就是函数f的返回类型。编译器并不实际调用函数f,而是使用当调用发生时f的返回值类型作为sum的类型。

另外的,decltype((i))的类型是引用

因此 decltype((i)) d时,d必须初始化

要注意在类定义的结尾加上分号

C++11规定,可以为数据成员提供一个类内初始值,创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将默认初始化

为确保各个文件中类的定义一致,类通常被定义在头文件中,且头文件名字应与类名一致。头文件中通常包含那些只能被定义一次的实体,如类、const和constexpr等。头文件一旦改变,相关的源文件必须重新编译

预处理器概述

确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor)

预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序

#include就是一项预处理功能,当预处理器看到#include标记时就会用指定的头文件的内容代替#include

还有一项预处理功能是头文件保护符,头文件保护符依赖于预处理变量。预处理变量有两种状态:已定义和未定义。#define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef为真<==>变量已定义 ,一旦检查结果为真,则执行后续操作直到遇到#endif指令

知识点--->条件编译,预处理器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值