C++入门基础知识

今天讲下C++的发展历程及他的几个入门的基础知识:

1.什么是C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语 言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语 言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程 序设计。

2.C++的发展历程

C++98
C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化 协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)。
C++11
增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto 关键字、新容器、列表初始化、标准线程库等。
到现在C20也快发布了!
以上提到的这两个版本是最具意义且最重要的两个版本!

3.C++入门基础知识

1)命名空间
用以区分同名变量,函数以及类的作用域,对标识符的名称进行本地化,避免命名冲突或名称污染。
定义命名空需要使用namespace关键字,后面够命名空间的名字,然后接一对{}。
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中!
下面举一例他基本的使用:

#include<iostream>
#include<stdlib.h>

using std::cout;
using std::cin;
using std::endl;

int cal(int a,int b)
{
	return a*b;
}

namespace N1                //定义了一个命名空间N1
{
	int cal(int a, int b)
	{
		return a + b;
	}
}

namespace N2               //定义了一个命名空间N2
{
	int cal(int a, int b)
	{
		return a - b;
	}
}

int main()
{
	int a, b;
	cout << "please input two number:"<<endl;
	cin >> a;
	cin >> b;
	cout<<"the result is:"<<cal(a, b)<<endl;
	cout<<"the result is:"<<N1::cal(a, b)<<endl;
	cout<<"the result is:"<<N2::cal(a, b)<<endl;
	system("pause");
	return 0;
}

上面的代码中可以看到首先是using std::cout…这三行,这三行就表示我现在只用C++标准库中的cout,endl,cin这三个函数。所以这个标准库的命名空间就将这些标准库函数和其他函数区分开来,命名空间相当一围墙而不是容器。在主函数中可以看到,如果直接调用cal函数的话,他会默认使用全局范围内的,则进行的是乘法;如果指定范围调用比如N1::cal()则会待用命名空间NI里的cal函数,"::" 这个符号表示作用域限定符。所以在这里命名空间就是解决了同名函数作用域的问题。

2)缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用默认值,否则使用指定的实参,可以形象的理解缺省参数就相当于一个汽车上的备用轮胎。
缺省参数可以分为 全缺省,半缺省。
注:
1.半缺省参数必须从左往右依次来给出,不能间隔着给出
2.缺省参数不能在函数声明和定义中同时出现
3.缺省值必须是常量或者全局变量
4.C语言不支持(编译器不支持)

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

举例如下:

int Add(int left, int right) 
{ 
	return left+right; 
}
double Add(double left, double right) 
{ 
	return left+right; 
}
long Add(long left, long right) 
{ 
	return left+right; 
}
int main() { 
	Add(10, 20); 
	Add(10.0, 20.0); 
	Add(10L, 20L);
	return 0; 
}

以上就实现了同名函数实现不同类型参数的计算

但下面这两个不能构成函数重载

short Add(short left, short right)
{ 
	return left+right;
}
int Add(short left, short right) 
{ 
	return left+right; 
} 

因为他们只是函数的返回值类型不同,这并不满足函数重载!

看到这里我们应该思考个问题,为什么C语言在输出变量值的时候需要指定类型比如%d,而C++却不需要,这是因为C++里的标准库函数cout是用函数重载实现的,所以你在使用是不需要指定参数类型,它会自动调用相应类型的函数,这就是函数重载方便的一点!

4)引用
关于引用可能觉得是很神奇的神奇,其实引用不是新定义一个变量,而是给已存在的变量取了个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量公用同一块内存空间。

void test()
{
	int a = 5;
	int& r = a;
	printf("%p\n",&a);
	printf("%p\n",&ra);
}

意:引用类型必须和引用实体是同种类型的
在这里插入图片描述
从上图中可以看到被引用变量和引用变量公用同一块内存空间,因为他们的地址相同,相对来树引用可以减小开销。
引用特性:
1.引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体

使用场景:
1.做参数

void Swap(int& left, int& right) 
{   
	int temp = left;   
	left = right;   
	right = temp; 
}

这样是会改变两个变量的值的,因为它是引用传递,他们在同一地址上,所以改变了引用变量的值,原变量的值也会跟着改变。

2.做函数返回值

int& TestRefReturn(int& a) 
{   
	a += 10;   
	return a; 
} 

这个原理同上

但是下面有个反例需要注意:

int& Add(int a, int b) 
{    
	int c = a + b;    
	return c; 
} 
int main() 
{    
	int& ret = Add(1, 2);    
	Add(3, 4);    
	cout << "Add(1, 2) is :"<< ret <<endl;   
	return 0; 
}

想想上面代码的执行结果是什么呢?
结果是7,是为什么呢?
原因是定义&ret = Add(1,2)则ret就是一个引用变量本质类似于指针,它就会指向调用Add(1,2)时开辟的那块内存空间,调用函数的过程是函数压栈,因此专门建立栈帧来存放它,虽然函数调用结束后,空间会释放,但是ret所指的那块空间并不等同于消失了,而是暂时没有被使用,所以下次Add(3,4)入栈ret就会得到结果7,当采用引用返回时c结果的生命周期不受函数调用限制,所以ret是会得到结果7的。一般不受函数限制的变量主要是全局变量和静态变量,这些都可以采用引用的方式返回。所以上面这个例子是一个比较特殊的情况。
引用和指针的区别:
语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值