C++入门基础知识点详解(上)

传送门

一、C++是谁?

    1、C++和C:青出于蓝

     2、C++的历史和如今发展

二、C++入门知识点:命名空间

     1、C++命名空间:概念

      2、C++命名空间:用法

三、C++入门知识点:缺省参数

      1、C++缺省参数:概念

      2、C++缺省参数:用法

四、C++入门知识点:函数重载

      1、C++函数重载:概念

      2、C++函数重载:原理


一、C++是谁?

        C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼博士在20世纪80年代初期发明并实现,最初它被称作“C with Classes”(包含类的C语言)。它是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,支持过程化程序设计数据抽象面向对象程序设计泛型程序设计等多种程序设计风格。

        C++是C语言的继承,进一步扩充和完善了C语言,成为一种
面向对象的设计语言。既然都说了C++是C的继承者,那么我们来看看C++和C语言到底有什么共同点和区别吧!

    1、C++和C:青出于蓝

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

        C++在C语言的基础上,扩充了许多新的功能,譬如支持泛型编程、可以运用面向对象思想来设计程序、支持数据抽象;C++也向下兼容许多C的语法,并且加以改进(譬如struct和class)。我们甚至可以下一个定义,90%C语言能做的事情,C++都可以做。

观察C++的关键字表,我们也可以看见许多关键字也出现在C语言中。

     2、C++的历史和如今发展

阶段内容
C with classes类及派生类、公有和私有成员、类的构造析构、友元、内联函数、赋值运算符重载等
C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0

更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、

抽象类、静态成员以及const成员函数

C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98

C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)

C++03C++标准第二个版本,语言特性无大改变,主要∶修订错误、减少多异性
C++05

C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名C++0x.

即∶计划在本世纪第一个10年的某个时间发布

C++11

增加了许多特性,使得C++更像一种新语言。

比如∶正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等

C++14

对C++11的扩展,主要是修复C++11中漏洞以及改进。

比如∶泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等

C++17

在C++11上做了一些小幅改进,增加了19个新特性。

比如∶static_assert()的文本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等

二、C++入门知识点:命名空间

        如果一个学校里,有两个学生都叫张三。有一天,你在广播里大喊一声:张三同学!你妈妈来给你送你最爱喝的O泡果奶了!这个时候,两个张三同学会同时懵逼,因为他们都无法确定广播里叫的是不是自己。这个时候,我们就需要进行一些范围限定,来选出目标的张三同学,例如:XX班张三。这样就引出了我们C++的命名空间的概念。

     1、C++命名空间:概念

        假如,你在两个不同的文件(或者命名空间)中,都定义了变量a,那么就会发生冲突问题,此时编译器就会分不清你要访问的到底是哪个a。为了解决这个问题,我们就引入了命名空间的概念,即:在不同的命名空间内,可以定义相同的变量名称、函数名称等,在需要访问的时候,限定相应的访问范围,即可解决访问冲突问题。(命名空间本质上就是起一个范围限定作用

   

      2、C++命名空间:用法

         命名空间的用法是非常简单的,因为它只是起到一个范围限定的作用。我们可以在定义类、变量、函数的时候,直接定义在namespace内部,使用时,通过“::”作用域限定符,来确定访问的是哪个命名空间:

#include<iostream>
using namespace std;

namespace CSDN
{
    int dztz = 20;

    void show()
    {
        cout << dztz << endl;
    }

    class XYZ
    {
    public:
        int dztz = 200;
    };
}

namespace ZYB
{
    int dztz = 2000;
}

using namespace CSDN;
using namespace ZYB;

int main()
{
    CSDN::XYZ z;
    cout << "CSDN::dztz:" << CSDN::dztz << endl;
    cout << "z.dztz:" << z.dztz << endl;
    cout << "ZYB::dztz:" << ZYB::dztz << endl;

	return 0;
}

        在上述图中,我们定义了多个dztz变量,并赋予它们不同的值,分别调用对应命名空间的dztz,可以看出来,命名空间的存在,极大的改善了多个同名变量、函数、类的命名冲突问题。

        我们既可以引入整个命名空间,也可以只引入命名空间内一些我们需要的东西。譬如:namespace std 是C++的标准库类型命名空间,C++里的cout、cin、endl等等,我们需要的东西都在std里,我们在使用这些语句时,就可以只引入部分对应的std内容。

//using namespace std;  全引入

//局部引入
//using std::cout;
//using std::endl;

int main()
{
    //在使用时引入
    std::cout << "hello C++" << std::endl;

	return 0;
}

三、C++入门知识点:缺省参数

        缺省的意思就是默认,缺省参数即默认参数。

      1、C++缺省参数:概念

        在C语言中,如果一个函数需要形参,那么在调用它的时候,就必须要传参给他,而C++则优化了这样的语法。C++在创建一个函数时,可以在形参位置,给定一些缺省参数(也即默认参数),这样一来,在调用该函数时,如果传参,则使用传递过来的参数;如果没有传参,则使用函数自带的缺省参数。

#include<iostream>
using namespace std;

void show(int X = 10,int Y = 20)
{
	cout << X << endl;
	cout << Y << endl << endl;
}

int main()
{
	show();            //缺省
	show(20);          //部分传参
	show(100, 200);    //传参

	return 0;
}

      2、C++缺省参数:用法

        缺省参数分为:全缺省和半缺省

        (1)全缺省:函数所有参数全部都有缺省值;

        (2)半缺省:函数部分参数具有缺省值,并且缺省值必须从从右向左给出。

                           不能间隔,和从左向右。

//全缺省
void show(int X = 10,int Y = 20,int Z = 30)
{
	cout << X << endl;
	cout << Y << endl;
	cout << Z << endl << endl;
}

//半缺省
void show(int X, int Y,int Z = 30)
{
	cout << X << endl;
	cout << Y << endl;
	cout << Z << endl << endl;
}

        缺省参数的注意点:

        (1)缺省参数必须是常量,或者全局变量。

        (2)缺省参数只能在函数声明或定义二者中出现一次(一般是在函数声明里缺省)

四、C++入门知识点:函数重载

      1、C++函数重载:概念

        在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等。在C++中,由于函数重载的原因,我们可以定义多个同名函数,根据参数列表的不同,来实现对应类型的交换函数。

#include<iostream>
using namespace std;

void Swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}

void Swap(double& a, double& b)
{
	double temp = a;
	a = b;
	b = temp;
}

int main()
{
	int x = 10;
	int y = 20;

	double m = 1.1;
	double n = 2.2;

	cout << "x:" << x << endl;
	cout << "y:" << y << endl;
	Swap(x, y);
	cout << "x:" << x << endl;
	cout << "y:" << y << endl << endl;

	cout << "m:" << m << endl;
	cout << "n:" << n << endl;
	Swap(m, n);
	cout << "m:" << m << endl;
	cout << "n:" << n << endl << endl;

	return 0;
}

      2、C++函数重载:原理

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

        其实,这和C++的编译阶段进行的处理有关。我们都知道一个.c\.cpp文件要变成可执行程序,都需要进行四个阶段的处理:预处理编译汇编链接

        而C语言在汇编阶段,进行符号汇总时,一个函数汇总后的符号就是它本身的函数名;倘若有多个同名函数的情况,则汇编阶段编译器就会报错,无法完成汇编(因为多个命名冲突)。而C++在进行符号汇总阶段,函数汇总后的符号不仅仅是它本身的函数名,还包含着它的参数个数以及参数类型;这样一来,即使函数名称相同,编译器也可以通过函数参数的个数顺序类型来区别同名函数的情况。C++代码在编译时会根据参数列表对函数进行重命名,例如void Swap(int a, int b)会被重命名为_Swap_int_intvoid Swap(float x, float y)会被重命名为_Swap_float_float。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

        从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。

//C语言是不允许同名函数的
void swap(int a,int b);
void swap(double a,double b);

//C++可以定义同名函数,只要满足函数重载的条件
void swap(int a,int b);
void swap(double a,double b);

        函数重载的三大条件必须牢记:

        1、形参顺序:void swap(int a,double b)  和  void swap(double a, int b)

        2、形参类型:void swap(int a,int b)  和  void swap(double a,double b)

        3、形参个数:void swap(int a,int b)  和  void swap(int a)

        函数返回值不同,是无法作为函数重载条件的!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值