[c++ primer笔记]2-变量和基本类型

简介: 变量和基本类型

2.1 基本内置类型

  • 当明确知晓数值不可能为负时,选用无符号类型
  • int爆了就直接用long long
  • 浮点直接用`double

2.2 变量

  • 对与C++程序员,变量variable对象object一般可以互换使用

    • 对象:通常指一块能够存储数据并具有某种类型的内存空间
  • 初始化与赋值是两个完全不同的概念:

    • 初始化:创建变量时赋予一个初始值
    • 赋值:将对象的当前值擦除,而以一个新值来代替
  • 列表初始化:
int a = 0;
int a = {0};
int a{0};
int a(0);

2.3 复合类型

  • 每条声明语句由一个基本数据类型(base type)和紧随其后的声明符(declarator)列表构成

    • 声明符为变量名时变量的类型就是基本数据类型

引用

  • reference
  • 指的是“左值引用(lvalue reference)”,C++11新增了“右值引用(rvalue reference)”
  • 引用就是给对象起了另外一个名字
int a = 1024;
int &b = a;//b指向a(b是a的另外一个名字)
int &c;//报错
  • 引用必须被初始化

    • 在定义引用时,它会与初始值绑定bind在一起,无法再重新绑定,所以必须初始化
    • 引用必须绑定在对象上
  • 引用即别名:引用并非对象,而是为已经存在的对象另起别名

指针

  • point指向 另外一种类型的复合类型,也实现了对其他对象的间接访问
  • 与引用区别:

    • 指针本身就是一个对象,允许对指针赋值和拷贝,可在生命周期内先后指向多个对象
    • 无需在定义时赋初值
    • 在块作用域未初始化会拥有一个不确定的值
double dp, *dp2;//dp是double型对象,dp2是指向double类对象的指针
  • 获取对象的指针
int *p = &ival;

引用和取地址共用符号&

  • 利用指针访问对象
int *p = &ival;
cout << *p;
  • 空指针:

    • null pointer
int *p1 = nullptr; // 等价 int *p1 = 0;
int *p2 = 0;       // 直接初始化为字面常量0
#include cstdlib
int *p3 = NULL;    // 等价 int *p3 = 0;
- 最好使用第一种(c++11新标准)
- 最好初始化所有指针
int zero = 0;
pi = zero;

是错误的,即使zero为0,不能吧int变量赋给指针

  • tips:

    • 任何非0指针对应的条件值都是true;
  • void* 指针

    • void* 是特殊指针类型,可存放任何对象的地址
    • 我们不能知道该地址到底是个什么类型的对象
  • 理解复合声明

    • 定义多个变量
    • 指向指针的指针
    • 指向指针的引用:引用本身不是对象,所以不能有指向引用的指针,但指针是对象,可以有对指针的引用

2.4 const

2.4.1 const限定符

  • const对象必须初始化
  • const的引用
const int ci = 1024;    //right
const int &r1 = ci;     //right,引用及其对象都是常量
r1 = 42;                //错误:r1是对常量的引用
int &r2 = ci;           //错误:试图让一个非常量引用指向一个常量对象
  • 引用的类型必须与其引用对象的类型一致:(除两种特殊情况)

    • 初始化常量引用时允许用任何表达式作为初始值,只要能强制类型转换就行[临时量]
    • 为常量引用绑定一个非常量

2.4.2 指针和const

  • 指向常量的指针不能用于改变其所指对象的值
  • tips:

所谓指向常量的指针和引用,不过是指针或引用自以为是罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值

  • 常量指针必须初始化

2.4.3 顶层/底层指针

  • 顶层指针:top-level const:指针本身就是个常量
  • 底层指针:low_level const:指针所指的对象是个常量
  • 一眼顶真o(^^o)

2.4.4 constexpr

  • 将变量声明为constexpr,以便编译器来验证变量的值是否是一个常量表达式
constexpr int chsm = 20;//20是常量表达式
constexpr int sz = size();//只有当size是一个constexpr函数
                          //其才是一条正确的声明语句
  • 一般来说,如果你认定一个变量是常量表达式,就把它声明成constexpr类型
  • constexpr与指针:

此限定符只对指针有效,与指针所指对象无关

const int *p = chsm;    //p是一个指向整型常量的指针
constexpr int *q = chsm;//q是一个指向整数的常量指针
  • constexpr将其定义的对象设置为了顶层指针

2.5 处理类型

2.5.1 类型别名

  • typedef
typedef oldname newname
  • 别名声明alias declaration
using newname = oldname;
  • 符合类型不能简单的翻译回去理解
typedef char *pst;
const pst cstr = 0;

const char* cstr = 0是对const pst cstr = 0的错误理解

改写前声明了一个指向char的常量指针
改写后声明了一个指向const char的指针(*成了声明符的一部分)

2.5.2 auto类型说明符

  • 让编译器去分析表达式所属类型
auto item = i1 + i2;

根据相加结果推断出item的类型

  • auto一般会忽略掉顶层const,若需保留则自己手动声明
  • 设置一个引用类型为auto,则初始值中的顶层const依然保留

2.5.3 decltype类型指示符

decltype( f() ) sum = x;

sum的类型由函数f的返回值绝对,decltype并不实际调用f()

  • decltype的括号:
decltype( (i) ) d;
decltype ( i ) d;

双层括号的结果永远是引用,单括号只有当i本身为引用时才为引用

2.6 自定义数据结构

没学到class前一直用struct就好

2.6.3 编写自己的头文件

  • 头文件保护符
#ifndef SALS_DATA_H
#define SALS_DATA_H
#include <string>
struct Sales_data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
#endif
  • 别想自己的程序用不用的到,加上就完事了
目录
相关文章
|
29天前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
23 1
|
7天前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
8 0
|
30天前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
15 1
|
30天前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
52 0
|
2月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
68 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
3月前
|
安全 C++
C++一分钟之-互斥锁与条件变量
【6月更文挑战第26天】在C++并发编程中,`std::mutex`提供互斥访问,防止数据竞争,而`std::condition_variable`用于线程间的同步协调。通过`lock_guard`和`unique_lock`防止忘记解锁,避免死锁。条件变量需配合锁使用,确保在正确条件下唤醒线程,注意虚假唤醒和无条件通知。生产者-消费者模型展示了它们的应用。正确使用这些工具能解决同步问题,提升并发性能和可靠性。
45 4
|
3月前
|
存储 C++ 容器
C++一分钟之-变量与数据类型入门
【6月更文挑战第18天】**C++编程基础:变量与数据类型概览** 了解变量(存储数据的容器)和数据类型是编程入门的关键。声明变量如`int age = 25;`,注意初始化和类型匹配。基本数据类型包括整型(int等)、浮点型(float、double)、字符型(char)和布尔型(bool)。理解类型范围和精度,使用字面量后缀增强可读性。深入学习数组、指针、结构体和类,以及动态内存管理,避免数组越界和内存泄漏。不断实践以巩固理论知识。
35 1
|
3月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
33 0
|
3月前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
3月前
|
C++
C++之变量与常量
C++之变量与常量