【C++Primer】第2章:变量和基本类型

简介: 【C++Primer】第2章:变量和基本类型

第2章 变量和基本类型


数据类型分无符号和带符号


编译器类型 char short int long float double 指针
32位编译器 1字节 2 4 4 4 8 4
64位编译器 1字节 2 4 8 4 8 8


8比特的signed char范围为-128~127区间


字面值常量


整型和浮点型字面值:


默认整型字面值为double


字符和字符串字面值:


编译器在每个字符串的结尾处添加一个空字符(’\0’),因此,字符串字面值的实际长度比它的内容多1


除了常见的字符类型,还有一些不常见的字符类型,用于扩展字符集,如wchar_tchar16_tchat32_t


wchar_t类型用于确保可以存放机器最大扩展字符集中任意一个字符


char16_t类型和char32_t则为Unicode字符集服务


指定字面值的类型



布尔字面值和指针字面值


true和false是布尔类型的字面值


nullptr是指针字面值


变量


对于C++程序员来说,变量对象一般可以互换使用


通常情况下,对象是指一块能存储数据并具有某种类型的内存空间


初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值


赋值的含义是把对象当前值擦除,而以一个新值来替代


几种初始化方法:


int a = 0;
int a = {0};    //叫做列表初始化
int a{0};
int a(0);


如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错


默认初始化


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


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


例如int默认初始化为0,string默认初始化为空字符串。


变量声明和定义的关系


声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明


定义负责创建与名字关联的实体


变量声明规定了变量的类型和名字,在这一点上定义与之相同。


定义还申请存储空间,也可能为变量赋一个初始值


声明不能显示初始化,加上了显示初始化则为定义


声明用关键字extern


extern int i;   //声明i而非定义i
int j;          //声明并定义j
extern double pi = 3.14   //定义


变量只能被定义一次,可以声明很多次


C++是一种静态类型语言


C++中作用域以花括号分隔


复合类型


引用和指针


引用和指针实现了对其他对象的间接访问


引用


我们说引用一般是指左值引用,C++11还新增了右值引用


引用必须初始化


引用并非对象,所以不能定义引用的引用


引用类型的初始值必须是一个对象,且是同一数据类型的对象;不能是字面值


引用只能绑定一次


int &a = 10;   //错误:引用类型的初始值必须是一个对象
const int &b = 0;   //正确,可以为常量引用绑定字面值


指针


指针本身是对象,而引用不是


指针无需在定义时赋初始值


int *P = &ival;   //p存放变量ival的地址,或者说p是指向变量ival的指针


空指针


生成空指针的几种方法:


int *p = nullptr;   //C++11新标准
int *p = 0;
int *p = NULL;


注意:int变量直接付给指针是错误的,恰好等于0也不行


int zero = 0;
int *pi = zero;  //错误


void*指针


可以存放任意对象的地址,并不知道这个对象到底是什么类型


指针的指针



const限定符


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


默认状态下,const对象仅在该cpp文件内有效;除非加extern声明


常量引用


const int ci = 1024;
const int &r1 = ci;   //现在r1和ci都是常量1024
int &r2 = ci;   //错误


int i = 42;
const int &r3 = i;  //可以,但是不允许通过r3修改i
r3 = 40;   //错误
i = 41;    //正确
cout << r3 << endl;  //41


const int * P:指向常量的指针,底层const


int * const p:常量指针,顶层const,不能修改p的值,即不能修改地址


const int * const p:指向常量的常量指针


顶层const表示指针本身是个常量


底层const表示指针所指的对象是一个常量


更一般的,顶层const可以表示任意的对象是常量


const int ci = 42;  //顶层const


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


constexpr int mf = 20;


类型别名


typedef double wages;   //wages是double的同义词
using SI = Sales_item;  //SI是Sales_item的同义词


auto类型说明符


C++11新标准引入


auto定义的变量必须有初始值


auto一般会忽略掉顶层const,同时底层const则会保留下来


decltype类型指示符


C++11新标准


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


decltype(f()) sum = x;   //sum类型就是函数f()的返回类型


返回类型包含顶层const和引用在内


auto,decltype都是类型说明符


decltype((i)) d;   //错误:d是int&,必须初始化    注意:双层括号结果永远是引用
decltype(i)  e;    //正确:e是一个未初始化的int


int a = 3, b = 4;
decltype(a = b) d = a;    //d是int & 型 4


头文件定义


防止重复包含的发生:


#ifndef SALES_DATA_H  //当且仅当变量未定义时才为真
#define SALES+DATA_H  //预处理变量
#include <string>
struct Sales_data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
#endif


#define是一条预处理指令,用于定义一个预处理变量


#endif是一条预处理指令,用于结束一个#ifdef或#ifndef区域


#ifdef是一条预处理指令,用于判断给定的变量是否已经定义


#ifndef是一条预处理指令,用于判断给定的变量是否尚未定义

目录
相关文章
|
6月前
|
编译器 数据安全/隐私保护 C++
c++primer plus 6 读书笔记 第十三章 类继承
c++primer plus 6 读书笔记 第十三章 类继承
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
26 0
|
4月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
39 1
|
3月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
96 0
|
6月前
|
安全 C++
C++一分钟之-互斥锁与条件变量
【6月更文挑战第26天】在C++并发编程中,`std::mutex`提供互斥访问,防止数据竞争,而`std::condition_variable`用于线程间的同步协调。通过`lock_guard`和`unique_lock`防止忘记解锁,避免死锁。条件变量需配合锁使用,确保在正确条件下唤醒线程,注意虚假唤醒和无条件通知。生产者-消费者模型展示了它们的应用。正确使用这些工具能解决同步问题,提升并发性能和可靠性。
69 4
|
6月前
|
存储 C++ 容器
C++一分钟之-变量与数据类型入门
【6月更文挑战第18天】**C++编程基础:变量与数据类型概览** 了解变量(存储数据的容器)和数据类型是编程入门的关键。声明变量如`int age = 25;`,注意初始化和类型匹配。基本数据类型包括整型(int等)、浮点型(float、double)、字符型(char)和布尔型(bool)。理解类型范围和精度,使用字面量后缀增强可读性。深入学习数组、指针、结构体和类,以及动态内存管理,避免数组越界和内存泄漏。不断实践以巩固理论知识。
45 1
|
6月前
|
C++
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
|
6月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
49 0
|
6月前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
6月前
|
C++
C++之变量与常量
C++之变量与常量