C++ 基础篇

C++ - 基础篇

1. 什么是C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象) 思想,支持面向对象的程序设计语言应运而生。

2. C++的发展历史

image

3. 关键字(C++98)

c++ 关键字:

image

c 关键字:

image

4. 命名空间

概述:

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将作用于全局作用域中,可能会导致很多命名冲突。使用命名空间的目的就是对标识符和名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

定义:

定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

一、命名空间的普通定义:

  #include<stdio.h>
  namespace N
  {
  	int a;
  	double b;
  }
  int main()
  {
  	N::a = 10; //将命名空间中的成员a赋值为10
  	printf("%d\n",N::a); //打印命名空间中的成员a
  	return 0;
  }

二、使用using将命名空间中的成员引入:

还可以通过“using 命名空间名称::命名空间成员"的方式将命名空间中指定的成员引入。这样一来,在该语句之后的代码中就可以直接使用引入的成员变量.

  #include<iostream>
  namespace N
  {
  	int a;
  	double b;
  }
  using namespace N;//将命名空间N的所有成员引入
  int main()
  {
  	a = 10;//将命名空间中的成员a赋值为10
  	printf("%d\n", a);//打印命名空间中的成员a
  	return 0;
  }

5. C++中的输入和输出

  #include <iostream>
  using namespace std;
  int main()
  {
  	cout << "hello world!" << endl;
  	return 0;
  }

在C语言中有标准输入输出函数scanf和printf,而在C++中有cin标准输入和cout标准输出。在C语言中使用scanf和printf函数,需要包含头文件>stdio.h。在C++中使用cin和cout,需要包含头文件iostream以及std标准命名空间。

  #include <iostream>
  using namespace std;
  int main()
  {
  	int i;
  	double d;
  	char arr[20];
  	cin >> i;//读取一个整型
  	cin >> d;//读取一个浮点型
  	cin >> arr;//读取一个字符串
  	cout << i << endl;//打印整型i
  	cout << d << endl;//打印浮点型d
  	cout << arr << endl;//打印字符串arr
  	return 0;
  }

C++的输入输出方式与C语言相比是更加方便的,因为C++的输入输出不需要增加数据格式控制,例如:整型为%d,字符型为%c。

6. 缺省参数

一、概念:

缺省参数是指在声明或定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

  #include <iostream>
  using namespace std;
  void Print(int a = 0)
  {
  	cout << a << endl;
  }
  int main()
  {
  	Print();//没有指定实参,使用参数的默认值(打印0)
  	Print(10);//指定了实参,使用指定的实参(打印10)
  	return 0;
  }

7. 函数重载

一、概念:

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同。函数重载常用来处理实现功能类似,而数据类型不同的问题。

  #include <iostream>
  using namespace std;
  int Add(int x, int y)
  {
  	return x + y;
  }
  
  double Add(double x, double y)
  {
  	return x + y;
  }
  int main()
  {
  	cout << Add(1, 2) << endl;//打印1+2的结果
  	cout << Add(1.1, 2.2) << endl;//打印1.1+2.2的结果
  	return 0;
  }

注意:形参列表不同是指参数个数、参数类型或者参数顺序不同,若仅仅是返回类型不同,则不能构成重载。

二、函数重载的原理:

为什么C++支持函数重载,而C语言不支持函数重载呢?

我们知道,一个C/C++程序要运行起来都需要经历以下几个阶段:预处理、编译、汇编、链接。

我们知道,在编译阶段会将程序中的每个源文件的全局范围的变量符号分别进行汇总。在汇编阶段会给每个源文件汇总出来的符号分配一个地址(若符号只是一个声明,则给其分配一个无意义的地址),然后分别生成一个符号表。最后在链接期间会将每个源文件的符号表进行合并,若不同源文件的符号表中出现了相同的符号,则取合法的地址为合并后的地址(重定位)。

在C语言中,汇编阶段进行符号汇总时,一个函数汇总后的符号就是其函数名,所以当汇总时发现多个相同的函数符号时,编译器便会报错。而C++在进行符号汇总时,对函数的名字修饰做了改动,函数汇总出的符号不再单单是函数的函数名,而是通过其参数的类型和个数以及顺序等信息汇总出 一个符号,这样一来,就算是函数名相同的函数,只要其参数的类型或参数的个数或参数的顺序不同,那么汇总出来的符号也就不同了。

三、总结:

1、C语言不能支持重载,是因为同名函数没办法区分。而C++是通过函数修饰规则来区分的,只要函数的形参列表不同,修饰出来的名字就不一样,也就支持了重载。
2、另外我们也理解了,为什么函数重载要求参数不同,根返回值没关系。
扩展:有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加“extern C”,意思是告诉编译器,将该函数按照C语言规则来编译。

8. 引用

一、概念:

引用不是定义一个变量,而是已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
其使用的基本形式为:类型& 引用变量名(对象名) = 引用实体。

  #include <iostream>
  using namespace std;
  int main()
  {
  	int a = 10;
  	int& b = a;//给变量a去了一个别名,叫b
  	cout << "a = " << a << endl;//a打印结果为10
  	cout << "b = " << b << endl;//b打印结果也是10
  	b = 20;//改变b也就是改变了a
  	cout << "a = " << a << endl;//a打印结果为20
  	cout << "b = " << b << endl;//b打印结果也是为20
  	return 0;
  }

一、引用和指针的区别:

在语法概念上,引用就是一个别名,没有独立的空间,其和引用实体共用同一块空间。

  int main()
  {
  	int a = 10;
  	//在语法上,这里给a这块空间取了一个别名,没有新开空间
  	int& ra = a;
  	ra = 20;
  
  	//在语法上,这里定义了一个pa指针,开辟了4个字节(32位平台)的空间,用于存储a的地址
  	int* pa = &a;
  	*pa = 20;
  	return 0;
  }

但是在底层实现上,引用实际是有空间的:从汇编角度来看,引用的底层实现也是类似指针存地址的方式来处理的。

引用和指针的区别(重要)::

   1、引用在定义时必须初始化,指针没有要求。
 2、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
 3、没有NULL引用,但有NULL指针。
 4、在sizeof中的含义不同:引用的结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)。
 5、引用进行自增操作就相当于实体增加1,而指针进行自增操作是指针向后偏移一个类型的大小。
 6、有多级指针,但是没有多级引用。
 7、访问实体的方式不同,指针需要显示解引用,而引用是编译器自己处理。
 8、引用比指针使用起来相对更安全。

posted @ 2023-03-07 16:11  盧倫  阅读(62)  评论(0)    收藏  举报