C++ Primer 学习笔记_4_变量和基本类型(续1)



变量和基本类型

四、const限定符

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. int main()
  3. {
  4. //for循环语句存在两个问题
  5. for (int index = 0;index != 512; ++index)
  6. {
  7. //...
  8. }
  9. return 0;
  10. }
  11. /*
  12. *1、程序的可读性:存在魔数512[魔数:他的意义在上下文中并没有体现出来,好像这个数是魔术般变出来的]
  13. *2、程序的可维护性...
  14. */
#include <iostream>

int main()
{
	//for循环语句存在两个问题
	for (int index = 0;index != 512; ++index)
	{
		//...
	}
	return 0;
}
/*
*1、程序的可读性:存在魔数512[魔数:他的意义在上下文中并没有体现出来,好像这个数是魔术般变出来的]
*2、程序的可维护性...
*/

1、定义const对象

[cpp] view plaincopyprint?

  1. //bufSize此时是一个左值,但是现在这个左值不可修改!
  2. const int bufSize = 512;
	//bufSize此时是一个左值,但是现在这个左值不可修改!
	const int bufSize = 512;

因为常量在定义之后就不能修改,所以定义时就必须初始化!

2、const对象默认为文件的局部变量

除非特殊说明,在全局作用域中声明的const变量是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问!

如若想被其他文件访问,需要在const前加extern关键字!

[cpp] view plaincopyprint?

  1. //file_1.cc
  2. extern const int bufSize = 512;
  3. //file_2.cc
  4. extern const int bufSize;
  5. for (int index = 0;index != bufSize; ++index)
  6. {
  7. //...
  8. }
//file_1.cc
	extern const int bufSize = 512;

//file_2.cc
	extern const int bufSize;
	for (int index = 0;index != bufSize; ++index)
	{
		//...
	}

【说明:】非const对象默认为extern。而const对象默认为非extern,要使const变量能够在其他的文件中访问,必须显式指定它为extern。

P50

[cpp] view plaincopyprint?

  1. //习题2.23(b)下列语句是否正确
  2. int cnt = 0;
  3. const int sz = cnt;
//习题2.23(b)下列语句是否正确
	int cnt = 0;
	const int sz = cnt;

五、引用

引用的主要作用是用作函数的形式参数。

1、下列语句是否正确

[cpp] view plaincopyprint?

  1. int ival = 1024;        //正确
  2. int &refVal_1 = ival;       //正确
  3. int &refVal_2 = refVal_1;   //正确
  4. int &refVal_3;          //错误
	int ival = 1024;		//正确
	int &refVal_1 = ival;		//正确
	int &refVal_2 = refVal_1;	//正确
	int &refVal_3;			//错误

2、当引用初始化之后,主要该引用存在,他就保持绑定到初始化时的对象,不能将引用绑定到另外一个对象!

初始化是指定引用指向哪个对象的唯一方法!

3、const引用[指向const对象的引用]

[cpp] view plaincopyprint?

  1. /*
  2. *仅仅允许const应用绑定到需要临时变量作为媒介来完成完全绑定过程的值
  3. *因为const引用是只读的,即:
  4. *非const引用只能绑定到与该引用相同类型的对象,
  5. *const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
  6. *理解下面程序:
  7. */
  8. int ival = 1024;
  9. const int &refVal_1 = 1024;
  10. const int &refVal_2 = ival;
  11. //  int &refVal_3 = refVal_2;
  12. int i = 42;
  13. const int &r = 42;
  14. const int &r2 = r + i;
  15. double dval = 3.14;
  16. const int &refDval = dval;  //如果int前的const去掉对不对呢?
/*
*仅仅允许const应用绑定到需要临时变量作为媒介来完成完全绑定过程的值
*因为const引用是只读的,即:
*非const引用只能绑定到与该引用相同类型的对象,
*const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
*理解下面程序:
*/
	int ival = 1024;
	const int &refVal_1 = 1024;
	const int &refVal_2 = ival;
//	int &refVal_3 = refVal_2;

	int i = 42;
	const int &r = 42;
	const int &r2 = r + i;

	double dval = 3.14;
	const int &refDval = dval;	//如果int前的const去掉对不对呢?

P52

[cpp] view plaincopyprint?

  1. //习题2.25,判断下列程序的输出结果
  2. #include <iostream>
  3. int main()
  4. {
  5. int ival = 2.01;
  6. int &rval2 = ival;
  7. const int &rval3 = 1;
  8. rval2 = rval3;
  9. ++ rval2;
  10. std::cout << rval3 << std::endl;
  11. return 0;
  12. }
//习题2.25,判断下列程序的输出结果
#include <iostream>

int main()
{
	int ival = 2.01;
	int &rval2 = ival;
	const int &rval3 = 1;
	rval2 = rval3;
	++ rval2;
	std::cout << rval3 << std::endl;
	return 0;
}

六、typedef

typedef用开定义类型的同义词

[cpp] view plaincopyprint?

  1. typedef double wages;
  2. typedef wages salary;
  3. //typedef定义以关键字typedef开始,后面是数据类型和标识符,标识符或类型名并没有引入新的类型,而至是现有的数据类型的同义词。
	typedef double wages;
	typedef wages salary;
//typedef定义以关键字typedef开始,后面是数据类型和标识符,标识符或类型名并没有引入新的类型,而至是现有的数据类型的同义词。

typedef通常被用于以下三种目的:

1、为了隐藏特定类型的实现,强调使用类型的目的

2、简化复杂的类型定义,使其更易理解

3、允许一种类型用于多个目的,同时使得,每次使用该类型的目的明确

时间: 2024-11-05 22:58:41

C++ Primer 学习笔记_4_变量和基本类型(续1)的相关文章

C++ Primer 学习笔记_3_变量和基本类型

 变量和基本类型 引言: 1.各种程序设计语言都具有许多各具特色的特征,这些特征决定了用每种语言适合开发哪些类型的应用程序. 2.大多数现代现代程序设计语言都采用两种方式扩充语言的基本特征集:允许程序员通过自定义数据类型扩充该语言:提供一组库例程,这些例程定义了一些并非内置在语言中的实用函数和数据类型. 3.C++是静态类型语言,支持在编译时执行类型检查. 4.包括C++在内的其他语言允许程序员定义的类型不仅有数据还包含操作! 5.掌握C++的第一步就是学习语言的基本知识和标准库! 6.类型

C++ Primer 学习笔记_5_变量和基本类型(续2)

 变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: [cpp] view plaincopyprint? enum {input, output, append}; const int input = 0; const int output = 1; const int append = 2; enum {input, output, append}; const int input = 0;

02.第二章_C++ Primer学习笔记_变量和基本类型

2.1  基本内置类型 2.1.1  算术类型 算术类型包括两类:整型和浮点型 2.2  变量 2.3  复合类型 2.4  const限定符 2.5  处理类型 2.6  自定义数据结构

C++ Primer 学习笔记_78_模板与泛型编程 -实例化[续]

模板与泛型编程 --实例化[续] 二.函数模板的显式实参 在某些情况下,不可能推断模板实参的类型.当函数的返回类型必须与形参表中所用的所有类型都不同时,最常出现这一问题.在这种情况下,有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值. 1.指定显式模板实参 如果函数形参类型不统一,该如何指定sum的返回类型? template <class T, class U> ??? sum(T, U); 此时使用任一形参调用都一定会在某些时候失败: sum(3, 4L); // 第二个类型

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_106_特殊工具与技术 --局部类

特殊工具与技术 --局部类 可以在函数体内部定义类,这样的类称为局部类.一个局部类定义了一个类型,该类型只在定义它的局部作用域中可见.与嵌套类不同,局部类的成员是严格受限的. 局部类的所有成员(包括函数)必须完全定义在类定义体内部,因此,局部类远不如嵌套类有用. 实际上,成员完全定义在类中的要求限制了局部类成员函数的复杂性.局部类中的函数很少超过数行代码,超过的话,阅读者会难以理解代码. 类似地,不允许局部类声明 static 数据成员,没有办法定义它们. 1.局部类不能使用函数作用域中的变量

C++ Primer 学习笔记_107_特殊工具与技术 --固有的不可移植的特征[上]

特殊工具与技术 --固有的不可移植的特征[上] C++从 C 语言继承来的不可移植特征:位域和 volatile 限定符.这些特征可使与硬件接口的直接通信更容易. C++ 还增加了另一个不可移植特征(从 C 语言继承来的):链接指示,它使得可以链接到用其他语言编写的程序. 一.位域 可以声明一种特殊的类数据成员,称为位域,来保存特定的位数.当程序需要将二进制数据传递给另一程序或硬件设备的时候,通常使用位域. 位域在内存中的布局是机器相关的. 位域必须是整型数据类型,可以是 signed 或 un

C++Primer学习笔记《三》

数组名其实就是一个常指针,指向数组元素中第一个的地址,在程序中如果要用指针遍历数组,不能直接用数组名来自增或自减,因为它是常量,一般先把数组名保存一份同类型的指针,然后再用这个指针来自增或是自减来实现遍历. 指针也是可以进行算术加法和减法的,但必须保证原地址和结果地址都是想同一个数组的元素或是指向数组的末端元素的下一个单元(类似end()). 指针的减法操作是有意义的,它表示两个指针的相对位置关系,减法结果是ptrdiff_t类型,和size_t类型一样,是一种机器相关的类型,size_t是无符