C++ primer 第二章

本文深入解析C++中的变量、基本类型、引用、指针、const限定符、auto和decltype类型说明符等内容,帮助读者掌握核心概念和编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二章 变量和基本类型

1 复合类型

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

基本数据类型:int、double等;声明符:变量名、引用&、指针*(引用和指针又称为类型修饰符,为声明符的一部分)等。

2 引用

  1. 引用并非对象,只是为已经存在的对象所起的另外一个名字。
  2. 因为引用本身不是对象,所以不能定义引用的引用。
  3. 引用必须在定义的时候初始化。

3 指针

  1. 指针是一个对象,因而允许定义指针的指针。
  2. 指针无须在定义时赋初值,但如果指针没有被初始化,将拥有一个不确定的初始值。

建议初始化所有指针,并且在可能的情况下,在定义了对象之后再定义指向它的指针。

  1. 空指针不指向任何对象,使用字面值nullptr初始化指针。
    void指针 该类型的指针所指向的地址中存放的对象的类型并不确定。

4 const限定符

const对象的值一旦创建后其值就不能再改变,所以const对象必须进行初始化。
默认状态下,const对象仅在文件内有效,当多个文件中出现了同名的const对象时,其实等同于在不同文件中分别定义了独立的变量。当我们希望在不同文件之间使用同一const对象时(只在一个文件中定义const,而在多个文件中声明并使用它),则需要添加extern关键字,如。

// file_1.cc定义并初始化一个常量,该常量可被其他文件访问
extern const int bufSize = fcn();
// file_1.h头文件
extern const int bufSize;// 与file_1.cc中定义的bufSize是同一个。

定义对const的引用后,不允许使用引用去改变它所绑定的对象。

4.1 指针和const

指向常量的指针
指向常量的指针不能用于改变其所指对象的值,只能使用指向常量的指针存放常量对象的地址。

const double pi = 3.14;
const double *cptr = π

和常量引用一样,指向常量的指针没有规定其所指向的对象必须是一个常量,只是限定不能使用指针更改对象的值。

常量指针(const pointer)

int errNumb = 0;
int *const curErr = &errNumb;// 从右往左进行解读,const说明curErr是常量,*说明是常量指针,int说明指向的对象是整形。
4.2 顶层const(top-level const)

指针本身是常量,或者说对象本身是不可变的。

int i = 0;
int *const p1 = &i;
4.3 底层const(low-level const)

指针所指向的对象是常量。

const int ci = 42;
const int *p2 = &ci;

5 auto类型说明符

在编程时,需要把表达式的值赋给变量,则需要知道表达式的值的类型。使用auto可以让编译器分析表达式所属的类型。

  • auto定义的变量必须有初始值。
  • 同一语句中的所有变量的初始基本数据类型必须相同。
5.1 引用与auto

使用引用的对象的类型作为auto的类型。

5.2 const与auto

auto会忽略掉顶层const,而保留底层const。

6 decltype类型指示符

希望从表达式的类型推断出要定义的变量的类型,但是不想使用该表达式的值初始化变量,这时就无法使用auto,需要使用decltype

6.1 decltype与const

如果decltype是一个变量,则decltype会返回该变量的类型,而不会忽略任何const。

7 编写自己的头文件

  1. 为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应与类的名字一样。
  2. 头文件通常包含那些只能被定义一次的实体,如const constexpr

注意:头文件一旦改变,相关的源文件必须重新编译以获取更新过的声明。

7.1 如何防止头文件的重复包含?

使用预处理技术

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

头文件保护符
头文件保护符属于预处理技术的一种,其状态依赖于预处理变量,预处理变量有两种状态:已定义、未定义。

#define指令把一个名字设为预处理变量
#ifdef当且仅当变量已定义时为真
#ifndef当且仅当变量未定义时为真
注意:当检查状态为真时,执行后续操作直到#endif指令为止。
使用头文件保护符防止重复包含头文件的例子:

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string.h>
struct Sales_data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
}

在其他文件第一次包含Sales_data.h时,程序检查#ifndef SALES_DATA_H为真,则执行后续语句,通过#define SALES_DATA_H定义预处理变量SALES_DATA_H,并将Sales_data.h的内容拷贝至当前程序中。那么当其他文件第二次包含Sales_data.h,程序检查#ifndef SALES_DATA_H为假,则不会执行后续语句,也就不会重复拷贝Sales_data.h头文件。

一般将预处理变量的名称全部大写,并且应该习惯性地加上头文件保护符.

【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值