C++ 学习指南基础(二)

目录

 

11. Reference

12. Nullptr and Dynamic Memory Allocation

13. Boolean data type

14. List Initialization

15. Type conversion

16. C++11 Enhancement for Type System

17. Automatic Type Deduction

18. Almost Always Auto (AAA)

19. Automatic Type Deduction: decltype

20. Simplified Memory Model for C++

21.Constant

22. Constant and Pointer

23.Usage of using, typedef, and #define

24. Const function

25. Scope of variable

26.Inline Function

27. Range-based for-loop

28. if and swtich Statement with an Initializer

29. Concepts of Class

30. Create Objects and Access the members


11. Reference

引用:

  1. 引用是在编译的过程中被处理的,实际上就是在编译层面对程序员进行的一个比较友好的语法,而在实现上是由编译器完成了地址的传递,实质上还是指针。

  2. 不能简单的理解为一个别名,我们可以这样用,但是要知道底层就是一个指针变量,是要占用内存空间的,和define是不一样的。

 

  1. 引用的定义

A reference is an alias for another variable. (引用就是另一个变量的别名)

 

  1. 声明引用变量的方法

 

  1. int x;

  2. int& rx = x;

或者

  1. int x, &rx = x;

     

  2. 引用的性质(非常重要)

Any changes made through the reference variable are actually performed on the original variable (通过引用所做的读写操作实际上是作用于原变量上).

A reference must be initialized in declaration 引用必须在声明的时候初始化。

Once initialized, the name of the reference cannot be assigned to other variables (引用一旦初始化,引用名字就不能再指定给其它变量)

 

  1. 引用类型做函数的参数:引用传递

You can use a reference variable as a parameter in a function and pass a regular variable to invoke the function. (引用可做函数参数,但调用时只需传普通变量即可)

When you change the value through the reference variable, the original value is actually changed. (在被调函数中改变引用变量的值,则改变的是实参的值)

 

  1. 例子

 

5.1. 例1:通过值传参

 

  1. //pass by value

  2. void swap(int x, int y){

  3. int t;

  4. t=x; x=y; y=t;

  5. }

  6. int main() {

  7. int a=5, b{10};

  8. cout << "Before: a=" << a << " b=" << b << endl;

  9. swap( a, b );

  10. cout << "After: a=" << a << "b=" << b << endl;

  11. return 0;

  12. }

 

输出结果:

Before: a=5 b=10

After: a=5 b=10

 

5.2.

例2:通过指针传参

  1. //pass by pointer

  2. void swap(int* x, int* y){

  3. int t;

  4. t=*x; x=y; *y=t;

  5. }

  6. int main() {

  7. auto a{5}, b{10};

  8. cout<< "Before: a=" << a << " b=" << b << endl;

  9. swap( &a, &b );

  10. cout<< "After: a=" << a << "b=" << b << endl;

  11. return 0;

  12. }

 

输出结果:

Before: a=5 b=10

After: a=10 b=5

 

5.3.

例3:通过引用传参

  1. //pass by reference

  2. void swap(int& x, int& y){

  3. int t;

  4. t=x; x=y; y=t;

  5. }

  6. int main() {

  7. auto a{5}, b{10};

  8. cout<< "Before: a=" << a << " b=" << b << endl;

  9. swap( a, b );

  10. cout << "After: a=" << a << "b=" << b << endl;

  11. return 0;

  12. }

 

输出结果:

Before: a=5 b=10

After: a=10 b=5

 

  1. 引用的性质的补充说明

 

  1. int a { 0 }, b { 1 };

  2. int& r { a }; // 引用变量 r 在声明的同时就要初始化,r是a的别名

  3.  

  4. r = 42; // 相当于 a = 42

  5. r = b; // 相当于 a = b; 执行后 a 的值是1

  6. // 此处不是让r变成b的引用

  7. // 引用r声明并初始化后,r就不能再改为其它变量的引用

  8. int& r2 = a; // 继续给a起别名

  9. int& r3 = r; // 声明引用变量 r3,用r初始化

  10. // 这个相当于 int& r3 = a; 因为 r 是 a 的别名

 

代码示例:引用变量、函数传参

随后展示两个现场编程的代码示例。

你可以打开C++开发环境,跟着视频一起写代码。

  1. 引用变量示例

示例中展示“整型引用”

 

  1. int x = 0, &rx = x;

示例中展示了“常量指针类型引用”

 

  1. const char* s = "Hello";

  2. const char*& rs = s;

 

  1. 函数传参

 

示例中展示了三个swap函数

  1. void swap( int x, int y );

  2. void swap( int* x, int* y );

  3. void swap( int& x, int& y );

 

单步调试示例说明

在“函数传参”的三个代码示例中,我们分别看了值传递、指针传递和引用传递三种形参实参调用方式。 void swap( int x, int y ); void swap( int* x, int* y ); void swap( int& x, int& y );

在随后的3个视频展示了程序运行过程中:

  1. 实参、形参存放的位置。以此来观察“形参”“实参”是否是同一个实体

  2. 实参、形参的值的变化。

这3个示例使用了集成开发环境的如下【调试功能】:

  1. 设置程序运行时的【断点】(BreakPoint)。

  2. 【单步运行】(Step Into)。

  3. 【查看】窗口(Watch)

程序必须以“Debug”模式编译; 程序必须以“Debug”模式运行

 

12. Nullptr and Dynamic Memory Allocation

空指针和动态内存分配

  1. 空指针

1.1. 0带来的二义性问题

  1. C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。

  2. C语言中,空指针使用(void *)0来表示

  3. 有时候,用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0)

1.2. C++标准化委员会希望“空指针”是一个确定的东西。 C++11中引入保留字“nullptr”作为空指针

 

  1. Dynamic memory management: Allocate/Release (动态内存管理:分配/释放)

2.1. C++中通过运算符new申请动态内存 new <类型名> (初值) ; //申请一个变量的空间 new <类型名>[常量表达式] ; //申请数组

 

如果申请成功,返回指定类型内存的地址; 如果申请失败,抛出异常,或者返回空指针(nullptr)。(C++11)

2.2. 动态内存使用完毕后,要用delete运算符来释放。 delete <指针名>; //删除一个变量/对象 delete [] <指针名>; //删除数组空间

13. Boolean data type

布尔数据类型

  1. 布尔类型的定义

布尔(英语:Boolean)是计算机科学中的逻辑数据类型,以发明布尔代数的数学家乔治·布尔为名。它只有两种值,通常是真和假

C++语言在其标准化过程中引入了bool、true和false关键字,增加了原生数据类型来支持布尔数据。

布尔类型的大小(所占的存储空间)依赖于具体的编译器实现。也可以用 sizeof运算符得到其占用的空间 (参见维基百科 https://zh.wikipedia.org/wiki/%E5%B8%83%E6%9E%97_(%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B) )

 

  1. 布尔类型的用途

布尔数据类型主要与条件语句相关。条件语句用来更改程序控制流。

  1. C++中的布尔类型 C++ keyword: bool, true, false 例如: bool isMyBook; bool isRunning = {false}; //C++11 列表初始化方式 bool isBoy( );

    bool hasLicense(); bool canWork(); bool shouldSort();

 

  1. 布尔类型与整型的转换(Conversion between bool and int) 转换规则:

    0- false // 整数0和布尔false互相转化

    true - 1 // 布尔true转化为整数1

    non-zero - true // 任意非0整数转化为布尔true

 

问题:'a' - ?

  1. 关系运算得到布尔值 关系运算(Relational Operation)包括:==, !=, <=, >=, <, > 例如 int a=0, b={1}; //C++11 3 == a; b < a; 3.2 >= b;

if (3 == a) { // blah blah }

 

  1. 逻辑运算得到布尔值 逻辑运算(Logical Operation)包括:&&, ||, ! int a={0}, b{1}; //C++11 a && b; b || 18; !a;

while (!a) {

// blah blah

}

  1. 代码示例 #include <iostream> int main() { bool isAlpha; isAlpha = false; if ( !isAlpha ) { std::cout << "isAlpha=" << isAlpha << std::endl; std::cout << std::boolalpha << "isAlpha=" << isAlpha << std::en

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值