走进C++:C到C++的过渡

2024-05-10 1198阅读

目录

什么是C++呢?

C++的发展史

多了一些吃前来很香的“语法糖”。

语法糖一:命名空间

命名空间有个强大的功能

如何使用

语法糖二:缺省参数

语法糖三:函数重载

语法糖四:引用        

引用传参

引用返回

引用和指针的不同点:

语法糖五:内联函数

内联函数相比于普通函数的特性

语法糖六:auto关键字(C++11)

auto的使用规则

语法糖七:基于范围的for循环(C++11)

范围for的语法

范围for的使用条件

语法八:指针空值nullptr(C++11)


什么是C++呢?

先官方的解释一下:

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。

为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。

因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

简而言之:

C++就是本贾尼大佬看不惯C语言,想要创造一门用起来更爽的语言,因此创造了C++。

同时C++也是包含C语言的,因此C语言的所有语法在C++都能使用。

走进C++:C到C++的过渡

看这位大佬的发量,就大体明白,C++也不是容易搞明白的,因此本文将带你利用C语言的基础,走进C++。

C++的发展史

虽然本贾尼是C++之父,但是C++的发展却不只是牺牲了这位大佬的“发际线”,当然还有其他大佬……

  1. C with classes(C++前身):引入了类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等特性。
  2. C++1.0:增加了虚函数概念,支持函数和运算符的重载,以及引用和常量等。
  3. C++2.0:提供了面向对象编程的支持,包括保护成员、多重继承、对象的初始化和抽象类、静态成员等。
  4. C++3.0:进一步完善了面向对象特性,引入了模板技术来解决多重继承产生的二义性问题。
  5. C++98:作为第一个官方发布的C++标准版本,得到了广泛的支持,并引入了STL(标准模板库)。
  6. C++03:对语言特性进行了小幅修订,主要是为了减少多异性。
  7. C++05:引入了TR1,正式更名为C++0x,增加了许多新特性,如正则表达式、基于范围的for循环等。
  8. C++11:引入了许多革命性的新特性,如lambda表达式、auto类型推导、标准线程库等,使C++更像一门现代语言。
  9. C++14:修复了C++11中的漏洞,并增加了新的特性,如泛型lambda表达式、二进制字面常量等。
  10. C++17:在C++11的基础上做了改进,增加了19个新特性,包括static_assert()、Fold表达式等。
  11. C++20:这是自C++11以来最大的发行版,引入了模块、协程、范围、概念等特性,并对已有特性进行了更新。
  12. C++23:目前正在制定中,预计会进一步扩展和优化C++语言的功能。

总的来说,C++语言从最初的C with classes发展到现在的C++23,历经多次迭代和更新,不断丰富和完善其功能,使其成为了一门强大而灵活的高级编程语言。

为什么要学习C++

C++是目前市面上使用最多的语言之一,C/C++一直在语言界稳居前三。

走进C++:C到C++的过渡

对于操作系统、嵌入式开发、服务端开发、游戏开发,都需要大量的使用C++,因此学习C++非常有必要。

言归正传,下面进入C++的正式学习。

开篇就提到,C++相比于C语言是用起来很“爽”的语言,为什么真么说呢,主要是C++补充了C语言的一些语法,可以理解为:

多了一些吃前来很香的“语法糖”。

语法糖一:命名空间

当我们写一些大型的C语言项目时,大量的变量命名常常会搞得我们头昏脑胀,不会命名、命名冲突,导致语法错误频出,C++便引入了第一个语法糖:命名空间。

对于C语言的函数,变量的命名我们已经很熟悉,那么C++是如何命名的呢?答案是借助一个关键字:namespace。namespace顾名思义就是命名空间的意思,因此namespace可以创建一个命名空间。

举例:

namespace XXX
{
    int x = 0;
    double y = 0.0;
}

为了防止命名冲突,我们将变x、y放在命名空间XXX中。需要注意的是,一个独立的命名空间,花括号的尾部不能有分号!

命名空间有个强大的功能

在C++中,命名空间(namespace)是一种将代码组织成逻辑块的机制,它可以包含类、函数、变量、模板、类型别名等。命名空间的主要目的是提供一种组织代码的方式,以避免命名冲突,尤其是在大型项目中或者当多个库被一起使用时。

类、函数、变量、模板、类型别名,都可以包含在命名空间中。同时命名空间可以套用命名空间。

如何使用

有了命名空间之后,我们该如何使用命名空间的内容呢?

namespace Test
{
	int test = 10;
	int Add(int a, int b)
	{
		return a + b;
	}
}

我们依靠的是一个操作符:域作用限定符 ::

为什么是域作用限定符呢?“域”即是区域,只要被花括号{ }括起来的空间,都可以看作一块域,访问命名空间,需要使用 ::限定符。

三大使用方式

以Test为例

方式一:将命名空间全部展开。

展开是一种授权,授权可以去对应的命名空间查找内部成员。具体实现为using namespace Test;

namespace Test
{
	int test = 10;
	int Add(int a, int b)
	{
		return a + b;
	}
}
using namespace Test;	//展开命名空间的所有元素
int main()
{
	printf("%d\n", test);
	return 0;
}

test变量属于Test命名空间,当展开Test命名空间之后,就可以访问内部成员。

但是,将命名空间全部展开也是一种危险的行为

namespace Test

{

    int test = 10;

    int Add(int a, int b)

    {

        return a + b;

    }

}

int test = 81;

using namespace Test;

见此代码,当test函数在全局与Test中同时定义时,就会出现命名冲突。因此无论哪种展开方式(包含下面的方案),展开都不应该出现命名冲突。

方法二:将部分成员展开。

具体实现是using Test :: test;表示展开Test空间中的test变量。using + 空间名字 :: 成员名字。此时仍然可以直接访问test。

方法三:直接在使用处展开。

格式: 命名空间 :: 成员

namespace Test
{
	int test = 10;
	int Add(int a, int b)
	{
		return a + b;
	}
}
// ::域作用限定符
int test = 81;
int main()
{
	printf("%d\n", Test::test);
	return 0;
}

虽然出现两个test,但是在使用处直接引用,就可以限定去Test空间寻找test变量,而不是去全局。

在工程中,常用的符号一般采用第二种展开方式,不常用的用第三种。

对于C++,有一个标准命名空间,叫做std,常用的函数都在std中。

在C++中,输出用cout,输入用cin,换行用endl,这些都定义在std中。

#include  
using std::cout;
using std::cin;
using std::endl;
int main()
{
	int i = 0;
	cin >> i;
	cout  
          1 
          , 
          2 
          , 
          3 
          };  
          
         
               
          auto  
          b 
          []  
          = 
           { 
          4 
          , 
          5 
          , 
          6 
          };  
          
          
          } 
          
          
          
           
           为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法 
           
           
           
          
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]