C++ primer 复习 第二章 变量和基本类型 2.2 — 2.6(1)

简介: C++ primer 复习 第二章 变量和基本类型 2.2 — 2.6

C++ primer 复习 第二章 变量和基本类型

2.2 变量

变量

变量提供一个可供程序操作的有名称的空间


变量都有类型,类型决定了变量的内存空间


int sum =0, val,   // sum,val和units_sold都是int型
units_sold =0; // sum 和 units_sold 初值为0,val未初始化
Sales_item item; // item 是 Sales_item 类型
std::string book("0-2-1-78345-X"); // book 变量通过字面值初始化

对于 C++ 来说,变量和对象是可以互换的


初始化

C++新标准,使用花括号初始化(列表初始化)


int units_sold =0;
int units_sold(0);
//列表初始化
int units_sold = { 0 };
int units_sold{ 0 };

使用列表初始化,若存在丢失信息的风险,则编译器报错


long double ld =3.1415926; //long double 多精度浮点型,不少于double精度,具体和编译器有关
int a{ ld }, b{ ld }; //错误:转换未正确执行
int c(ld),d=ld; //正确:转换执行,且确实丢失了部分值

默认初始化

如果定义变量没有被初始化,则变量被赋予默认值


默认值由变量类型决定,且和变量定义位置有关


内置类型,函数体之外被初始化为 0


每个类决定其初始化对象的方式


std::string empty; // 非显式的初始化一个空串
Sales_item item; // 默认初始化 Sales_item 对象

未初始化的变量含有一个不确定的值,将带来无法预计的后果,应避免


变量定义与声明

C++是静态类型语言,其含义是在编译阶段检查类型。因此在使用某个变量前必须声明


如果声明一个变量而非定义它,就在变量名前加上extern关键字,且不要显式初始化


//若在函数内部则 : 不允许对外部变量的局部声明使用初始值设定项
extern double pi =3.14;//定义不能放在函数内部
int main(){
  extern int i;//声明 i 而非定义 i
  int j;//声明 j 并定义 j
}

声明和定义的区别在于,变量可以被声明多次,但只能被定义一次


标识符

C++标识符由字母、数字和下划线组成,只能由字母或下划线开头。标识符无长度限制但大小写敏感。C++ 关键字和操作符替代名不可作为标识符


C++ 关键字



C++ 操作符替代名


名字作用域

同一个名字出现在程序不同位置,可能指向不同实体


C++作用域大多以花括号分隔


名字有效区域始于名字声明语句,结束于声明语句所在作用域末端


#include<iostream>/*
这里是全局作用域
*/
int main(){
    //这里是块作用域
    int sum =0;  //始于sum声明语句
for(int val=1;val<=10;++val){
        sum += val;
    }
    return 0;
}

2.3 复合类型

复合类型

是指基于其它类型定义的类型


引用

区别:C++11新增了 右值引用,当我们使用术语 引用时,一般指左值引用??


为对象起的另一个名字,定义引用时,程序把引用和它的初始值绑定在一起,而不是把初始值拷贝给引用。引用必须初始化,本身不是对象,所以不能定义引用的引用


int val =1024;
int &refVal = val;
//int &reVal2; //报错,引用必须初始化
int li = refVal; //等同于li = val
refVal =2;//把2赋给refVal指向的对象,此处即赋给了val
int& refVal3 = refVal; //正确,refVal3绑定到了与refVal绑定的对象,即绑定了val

指针

对地址的封装,本身就是一个对象


定义指针类型的方法是将声明符写成 *X 的形式


一个语句定义多个指针变量,则每个都需要加 * 符号


和内置类型一样,指针在块作用域内定义未初始化,将拥有一个不确定的值


int *p1, *p2; //p1和p2都是指向int型对象的指针
double dp1, *dp2;

可以通过取地址符 & 获取指针封装的地址


可以通过**解引用符 *** 利用指针访问对象


int val =42;
int*p = &val;
double *dp = &val; //错误类型不匹配

理解:为什么会报类型不匹配错误


从取地址符的角度,无法把一个 int 类型的地址赋值给 double 类型的指针


从解引用符的角度,需要统一指针类型和数据类型,不然无法取值(更合理)


空指针

不指向任何对象,使用指针前先判空


三种空指针


int *p1 = nullptr;
int *p2 =0;  //C语言中定义了 0 地址,不指向任何对象
int *p3 = NULL; //#include<cstdlib>

无法用整型初始化指针


int zero =0;
int* ptr = zero; //错误,类型不匹配

void* 指针

类型无关指针,可存放任意对象地址


int obj1 =3;
double obj2 =3.14, *ptr1 = &obj2;
void* pv = &obj1;
pv = &obj2;

指向指针的指针

通过 * 的个数可以区别指针的级别


int val =1024;
int* p1 = &val;
int **p2 = &p1; //p2指向 int*

指向指针的引用

指针是对象,可定义引用


int val =1024;
int* p1;
int* &r = p1; //r是一个对指针的引用
r = &val; //即p1 = &val
*r =0; //*r = *p1 = val =0

2.4 const 限定符,constexpr

被 const 限定符 修饰的变量,其值不能被改变(变量—>常量)


const int bufSize =512; //输入缓冲区的大小
//bufSize =512; //错误,表达式必须是可被修改的左值

const 对象必须初始化(其它时候不能出现在等号左边,不能被修改)


const int i = get_size(); //正确,运行时初始化
const int j =42; //正确,编译时初始化
const int k; //错误,未初始化

用 const 对象给指针赋值


编译时,编译器会把 zero ,替换为 0 ,所以可以这么写


const int zero =0;
void* ptr = zero;

多个文件共享 const 对象


在变量定义前加上 extern 关键字


// file.h 头文件
extern const int bufSize; //声明 bufSize const 对象
//file.cpp 
extern const int bufSize = func(); //定义且初始化 bufSize 对象,该常量可被其它文件访问

const 引用


即对常量的引用


const int ci =1024;
const int &r = ci; //正确,引用和绑定的对象都是常量
r =42; //错误,等同于 ci =42 ,试图修改常量
int &r2 = ci; //错误,ci是常量,存在通过 r2 改变 ci 的风险

存在对常量修改的风险,所以无法将一个非常量引用赋值给常量引用


类型 + 修饰符(描述变量属于哪种内置类型)+ 变量名


指针 和 const

指向常量的指针


const double pi =3.14;
//double * ptr = &pi;//错误,存在通过指针修改常量的风险
const double *ptr1 = &pi;
*ptr1 =42;//错误
double val =3.14;
ptr1 = &val;//正确,但不能通过ptr1修改val的值

const 指针


指针是对象,也可以被限制为常量(必须初始化)


把 * 放到 const 之前,说明指针是一个常量;不变的是指针,而非指向的值


int errNum =0;
int *const curErr = &errNum;
const double pi =3.14;
const double *const pip = &pi;//指向常量的常量指针
*pip =2.71;//错误,试图修改常量
if (*curErr){
  *curErr =0;//正确,修改变量errNum
}



顶底层const

顶层 const :指针本身是一个常量


底层 const : 表示指针指向的对象是一个 const


是否有常量被修改的风险


int i =0;
int* const p1 = &i; //顶层
const int ci =42; //顶层
const int * p2 = &ci; //底层
//是否有常量被修改的风险
const int* const p3 = p2;
i = ci;
p2 = p3;
int *p = p3;//存在通过 *p 修改 *p3(const)风险
p2 = &i;//正确,只是无法用*p2修改i的值
int&r = ci;//错误,存在通过r修改ci的风险
const int &r2 = i;//正确,只是无法通过 r2 修改 i 的值

constexpr 和常量表达式

常量表达式是指 :值不会改变且在编译期间就能得到计算结果的表达式 (例,字面值常量)


自定义类型不能被定义成 constexpr ,例 string


const int max_files =20;//是
const int limit = max_files +1;//是
int staff_size =27;//不是
const int sz = get_size();//不是

constexpr 变量


C++11规定允许将变量声明为 constexpr 类型,验证变量的值是否为一个常量表达式


一个是一个常量,必须用常量表达式初始化


constexpr int mf =20;
constexpr int limit = mf +1;
constexpr int sz = size(); //只有size()返回值是一个constexpr时才正确

指针和 constexpr


限定符仅对指针有效和指针所指对象无关

constexpr int *np = nullptr; //指针常量
int j =0;
constexpr int i =42;
constexpr const int *p = &i; //p是指针常量,指向常量
constexpr int *p1 = &j; //p1是指针常量,指向变量
相关文章
|
4天前
|
存储 IDE 编译器
深入探索C++中的变量世界:理论与实践
【4月更文挑战第5天】本文介绍了C++变量的基础知识,包括声明、数据类型、const和volatile限定符。通过示例展示了变量在用户输入、计算、控制流程和函数参数中的应用,并列举了常见错误及避免方法,如未声明、作用域混淆、类型不匹配、未初始化和拼写错误。最后提出了变量命名、避免冗余、适时复用、注释说明和利用现代C++特性的最佳实践。
29 0
|
4天前
|
存储 安全 C++
C++ 用户输入与数据类型详解:建立基本计算器及变量类型
了解C++的用户输入和数据类型。使用`cin`从键盘读取数据,如在简单计算器示例中获取两个数字并求和。C++的数据类型包括:`int`(整数)、`float`(浮点数,约6-7位小数)、`double`(更精确的浮点数,约15位小数)、`bool`(布尔值,true或false)、`char`(单个字符)和`string`(文本字符串)。每种类型都有特定的存储大小和用途。在处理浮点数时,`double`通常更安全。字符串需要包含`&lt;string&gt;`库。更多内容可关注微信公众号`Let us Coding`获取。
42 0
|
4天前
|
存储 C++ 容器
学会在 C++ 中使用变量:从定义到实践
C++中的变量是数据容器,包括`int`、`double`、`char`、`string`和`bool`等类型。声明变量时指定类型和名称,如`int myNum = 15;`。`cout`与`&lt;&lt;`用于显示变量值。常量用`const`声明,值不可变。变量名应唯一,遵循特定命名规则,常量声明时需立即赋值。
118 1
|
4天前
|
算法 C++
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
12 0
|
4天前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
4天前
|
存储 程序员 编译器
C++从入门到精通:1.1.1基础语法之变量
C++从入门到精通:1.1.1基础语法之变量
|
4天前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出
|
4天前
|
存储 监控 编译器
【C++】static关键字及其修饰的静态成员变量/函数详解
【C++】static关键字及其修饰的静态成员变量/函数详解
45 3
|
4天前
|
编译器 C++
C++:编译器对被const修饰变量的处理行为(替换)
C++:编译器对被const修饰变量的处理行为(替换)
14 0
|
4天前
|
算法 测试技术 编译器
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean(二 )
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean
29 0