初步认识C++

本文深入探讨C++语言的历史背景,对比C语言的增强特性,包括面向对象编程、泛型编程、异常处理等。同时,文章详细介绍了C++在系统软件、服务器开发、游戏制作等领域的广泛应用,并解析了C++与C语言在语法、内存管理、函数重载等方面的差异。

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

(一)C++语言的历史

  1. C++语言是c语言的继承,它既可以进行c语言的过程化程序设计,又可以进行以抽象1数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。
  2. C++不仅拥有计算机高效运行的使用性特性,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力
  3. C 语言作是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言并不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming)思想,支持面向对象的程序设计语言应运而生。Smalltalk 就是当时问世的一种面向对象的语言。在实践工作中,由于C语言的广泛使用,在C语言的基础上根据面向对象的思想发展了C语言,形成了C with class (带类的C语言)。
  4. 1982年,美国AT&T公司贝尔实验室的Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++,而Bjarne Stroustrup博士被尊称为C++语言之父。
    C++是C语言的加强,是以C语言为基础,并完全兼容C语言的特性。

(二)C++的应用领域

C++语言主要用于以下领域:
A、系统层软件开发
B、服务器程序开发
C、流戏,网络,分布式,云计算
D、科学计算

(三)C++语言的内容

C++语言是在C语言基础上扩展发展而来,完全兼容C语言。在C语言基础上,C++语言主要包括三大部分:C++对C语言基础语法的扩展,面向对象支持(继承,封装,多态),STL等。下图是一个网上的图,简单方便理解
在这里插入图片描述

(四)C++是C语言的增强

C语言是一个结构化语言,重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++首要考虑的是如何构造一个对象模型,让构造的模型能够契合与之对应的问题域,通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于解决问题的思想不一样,C语言是面向过程的语言,C++是面向对象的语言。
C++对C的增强表现在六个方面:
(1) 类型检查更为严格。
(2) 增加了面向对象的机制。
(3) 增加了泛型编程的机制(Template)。
(4) 增加了异常处理。
(5) 增加了运算符重载。
(6) 增加了标准模板库(STL)。

(五)C++语言与C语言细节上区别

一、C++与C语言的不同点(语法的变化)
宏观角度的变化
1、C++基本上支持C语言的所有语法。
2、C++支持面向对象的编程思想。
3、C++支持运算符重载与引用。
4、C++支持泛型编程(模板支持)。
5、C++支持异常处理(catch,try)。
6、C++的类型检查比C严格的多。
例如:void* 不能与其他类型进行转换
其他类型的数据不能为枚举赋值等等。

	g++ code.cpp 编译方式与扩展名发生改变

	#if __cplusplus
		printf("C++\n");
	#elif
		printf("C\n");
	#endif
	判断是什么编译器编译的

细节的变化:
1、文件扩展名的变化:
	C: .c .h
	C++: .cpp .C .cc .cxx
2、编译器
	g++ 大多数电脑需要额外安装:ubuntu为例:sudo apt-get g++
	gcc 也可以继续使用,但需要添加 -lstdc++
3、常用的头文件
	#include <iostream> C++原生的头文件不带.h以示与C的区分
	C语言的头文件也能继续使用 但是形式变为
	#include <cstdio>(stdio.h也能继续使用)。
4、数据的输入输出
	cout << 数据或变量
	endl 换行
	多个数据之间用
	cin >> 变量名(不需要再取地址,不需要占位符,C++会自动推导)。
	scanf/ printf也可以继续使用。
5、增加的名字空间
	std::标识符 //临时使用
	using namespace std;// 导入空间,只需要导入一次。
6、结构体的变化
	1、关键字没有变,但在定义结构体变量时,struct 关键字可以省略,不需要再用typedef
	2、结构体中可以定义成员函数,只能通过结构对象(->/.)进行调用,在成员函数中可以直接使用成员变量。
7、枚举、联合
	1、在定义枚举、联合对象时,enum\ union 可以省略。
	2、整型数据不能为枚举赋值。
	3、联合中也可以有成员函数,用法与 struct 一致。
8、操作符别名
	在某些欧洲语言所使用的键盘上字母比26个字母多,因此就占用了键盘上的“~,&”等符号,国际标准化组织就规定了这些运算符的别名。
	&&  --》  and
	||  --》  or
	{   --》  <%
	}   --》  %>
	!  	--》  not

二、C++ 中的字符串类
在C++中建议使用string代替char*,但是也是在char* 的基础上封装出来的,具体用法参考课件。

三、函数重载
1、什么是函数重载
在同一作用域中!!!,函数名相同但参数表不同,即构成重载关系。 作用域不同不会形成重载

2、重载与返回值类型无关,与参数名也无关。
3、重载函数通常是为了完成功能相似但类型不同的函数,统一命名有利于代码的阅读。


1、C++是如何实现函数重载的。
	a)、++在编译时函数名会经历换名的过程,把原本的函数名添加参数类型的缩写形成新的函数名,因此函数名不会重复。
	b)、换名机制虽然能够实现重载,但会限制C和C++模块之间的交叉引用。
		C   C++
		func()   func()->funcv

	_Z4funci int
	_Z4funcc char
	_Z4funcv void

2、extern "C" {代码}
	a)要求C++编译器按照C的标准处理函数名(不换名,也无法重载),这样一来函数名就不能重名。因此C++编译出的代码可以被C调用。
	b)C++完全兼容C,所以C标准处理的函数名C++可以自动识别。
	c)函数的声明也需要 extern "C"{#include "filename.h"}。

3、重载和作用域
	只有同一作用域的同名函数才会构成重载,不同作用域下的同名函数构成隐藏。

4、重载解析
	调用函数时,会根据实参的类型推导出一个函数的版本,这个过程叫做重载解析		
	然后把推导出的结果与重载集合进行匹配(编译器负责匹配过程),会有三种匹配结果,1)、编译器找到实参最佳的匹配,并生成调用代码。2)、找不到与推到结果相匹配的函数,编译器给出错误信息。 3)、存在多个与实参匹配的函数,但没有一个最终选择,这种错误叫做二义性。
5、实参类型转换
	为了确定最佳匹配,编译器将实参的类型转换为以下等级。1)最高级别:精准匹配,实参与形参类型相同 2)const 属性实现的匹配,带 const 属性的实参会优先选择带 const 的形参 3)通过类型提升的匹配 4)通过标准转换实现的匹配。
	字符串字面值就是 const char* ,且要修饰指针类型的数据的时候会影响。
 

四、默认形参
1、在C++中可以为函数的形参设置默认值,当调用该函数时,若是没有实参则使用默认形参
2、如果其中一个参数有默认值,那么它后面的参数必须都要有默认值。
3、默认形参必须靠右边
4、由于形参的默认值在编译阶段就确定了,因此给形参设置的默认值必须是常量、常量表达式、全局变量等
5、如果函数的定义与声明需要分开,则只能在函数的声明时设置默认值。
6、默认形参可能会影响函数的重载造成二义性。

五、内联函数
1、在正常情况下函数会被编译成二进制指针存在代码段,当调用函数时会有一条跳转指针跳转到函数所在的代码段中。
2、内联函数(inline)就是把函数编译好的二进制指令替换该跳转指令,这样能提高执行的运行速度,但会提高 代码段 的空间大小。
3、显示内联和隐式内联
显示内联:在函数定义的前面添加 inline 关键字,这种方式是显式的告诉编译器希望优化为内联函数。

隐式内联:在结构、联合、类中定义的成员函数。会被自动优化为内联函数,这种被称为隐式内联。
4 .内联适用的条件
a)inline 关键字是对函数实施内联优化的一种期望,是否优化为内联函数由编译器的优化策略决定。
b)带有递归或动态绑定特性的函数无法实施内联,编译器会忽略声明部分的 inline 。
c)内联会使可执行文件的体积和内存开销都变大,因此只有使用频繁简单的函数才适合当内联。
d)很少被调用的(说明能优化出的时间有限)和复杂函数(牺牲的空间比较大),由于内联而获得的时间不足以抵消空间带来的损失,这种情况不适合内联。**

六、C++的内存管理
1、C语言中的内存管理还能继续使用,malloc/free
但是需要类型转换,void* 不能自动转换为其他类型
2、在C++建议使用 new/delete 操作符管理内存。
3、new返回的是带类型的地址,不需要转换。
new 类型[数量]//必须要用delete[]指针; 形式来释放。 new会调用构造函数 delete会调用析构函数  
new 类型(初始值);
4、delete释放野指针是不确定的,释放空指针时不会出错,但是delete不能重复释放内存。
5、如果new申请内存失败会抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值