C++入门

本文详细介绍了C++语言的发展背景及其相对于C语言的主要改进之处,包括更严格的类型检查、面向对象的支持、泛型编程机制等。此外,还探讨了C++中的重载机制、缺省参数的使用以及命名空间的概念。

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

C++

C++是一种面向对象的计算机程序设计语言,它是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持多重过程化程序设计,数据抽象,面向对象程序设计,泛型程序设计等多种程序设计风格。C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的设计语言。
为什么会有C++?计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。C语言不是为初学者设计的,而是为计算机专业人员设计的。大多数系统软件和应用软件都是用C语言编写的。但是随着软件规模的增大,用C语言编写程序渐渐显得有些吃力了。
C++是由C发展而来的,与C兼容。用C语言写的程序基本上可以不加修改的用于C++。他是C的超越和集中。C++既可用于面向过程的结构化程序,有可用于面向对象的程序设计,是一种功能强大的混合型程序设计语言。
C++对C的增强,表现在六个方面:

  1. 类型检查更为严格。
  2. 增加了面向对象的机制。
  3. 增加了泛型编程的机制。
  4. 增加了异常处理。
  5. 增加了运算符重载。
  6. 增加了标准模板库(STL)。

    C++一般被认为是C的超集合,但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效。最常见的差异之一是,C允许从void*隐式转换到其他的指针类型,但是C++不允许。下列是有效的C代码:

//从void*隐式转换为int*
int* i = malloc(sizeof(int)*5);

但要使其在C和C++两者皆运作,就要使用显示转换:

int* i = (int*)malloc(sizeof(int)*5);

为什么C++支持重载?C语言不支持

重载:在同一个作用域中,参数列表不同(参数个数不同/参数类型不同),返回值可以相同也可以不同。如:

void Func(int a)
{
    cout<<a<<endl;
}
void Func(char b)
{
    cout<<b<<endl;
}
int main()
{
    int a = 10;
    char b = 'b';
    Func(a);
    Func(b);
    return 0;
}

这里写图片描述

void Func(int a)
{
    printf("%d\n", a);
}
void Func(char b)
{
    printf("%c\n", b);
}
int main()
{
    int a = 10;
    char b = 'b';
    Func(a);
    Func(b);
    system("pause");
    return 0;
}

这里写图片描述

在程序运行过程中,会经过预处理,编译,汇编,链接四个阶段,C语言在进行重载时可以通过前三个阶段,但是链接不能通过,因为在链接的过程中main函数是通过call指令找函数名字来完成链接的。
观察在C语言和C++目标文件中的函数名字的不同,在C语言中目标文件中的函数名就是函数名,所以在链接的时候如果出现两个相同的目标文件就会出现访问冲突。但是在C++中目标文件中的函数名由它的函数名和函数参数共同构成,所以在链接的时候只要函数参数不同就可以访问到相应函数,从而不会发生访问冲突的问题。

缺省函数

缺省参数,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,就无需指定该函数。
缺省参数分为:
全缺省参数:形参全部设定为默认值。
半缺省参数:对部分形参设定为默认值。

全缺省

int Add1(int a = 0, int b = 0)

半缺省

int Add2(int a, int b = 0)
#include<stdlib.h>
#include<iostream>
using namespace std;
int Add1(int a = 0, int b = 0){
    return a + b;
}
int Add2(int a, int b = 0){
    return a + b;
}
void Test(){
    cout<<Add1()<<endl;
    cout<<Add1(1)<<endl;
    cout<<Add1(1, 1)<<endl;
    cout<<Add2(2)<<endl;
    cout<<Add2(2, 2)<<endl;
}
int main(){
    Test();
    system("pause");
    return 0;
}

这里写图片描述

注意:

  • 缺省参数只能从右往左连续设定。
  • 对于缺省参数,若传递了实参,则用实参,若没有传递,则使用缺省参数。
  • 当某些全缺省参数函数和半缺省参数函数以及函数重载发生冲突时,会报错。
  • 缺省参数不能在声明和定义中同时出现。在声明中出现了缺省参数,定义中就不能出现;在声明中没有出现缺省参数,定义中可以出现(也可以不出现)。函数的使用按照声明的格式来调用。
  • 缺省函数的值可以使用宏和全局变量。

命名空间

名字空间域相当于一个文件域。它是用来解决全局命名冲突的问题的。名字空间域是随C++而引入的,它相当于一个更加灵活的文件域(全局域),可以用{}把文件的一部分扩起来,并以关键字namespace开头给它起一个名字:

namespace name1
{
    int a = 10;
}
namespace name2
{
    int a = 20;
}

名字空间的使用方法:

  • using namespace 名字空间名;(指定该名字空间为全局域)
  • 名字空间名::名字空间中的内容(“::”表示作用域解析符,用于指明使用哪个域)
    如:using namespace std;表示程序中某些变量默认使用名字空间std中定义的变量。
    name1::a 此时的a值即为10,而不是20。

变量的访问规则:

  1. 如果访问的变量没有指定名字空间域。
    (1) 如果在main中被定义了局部变量,则遵循就近原则,访问该局部变量。
int a = 20;
int main()
{
    int a = 10;
    cout<<a<<endl;//输出为10
}

(2)如果没有,则访问定义中的全局变量。如果定义了全局变量或者using指定的全局域中都有定义该变量,则发生冲突。

namespace name1
{
    int a = 10;
}
int a = 20;
using namespace name1;
int main()
{
    cout<<a<<endl;//此时会访问冲突,因为定义了全局变量a=20
//又指定了全局域name1,name1中也有变量a
}

2.如果访问的变量指定了名字空间域
(1)如果显式指定了名字空间域,则根据指定的名字空间域进行查找,找不到则报错,如:

namespace name1
{
    int a = 10;
}
int a = 20;
int main()
{
    int a = 30;
    //此时会访问name1中的变量,所以a为10
    //如果没没有定义名字空间name1或者name1中没有定义变量a,
    //则出错
    cout<<name1::a<<endl;
}

(2)如果访问的变量形式“ ::a”,此时表示的是在全局域中访问a,则在全局域(using指定的全局域)中访问a;对于a的访问遵循以下规则:

a.如果有全局变量,则在访问全局变量。
b.如果没有全局变量a,则在全局域(using指定的全局域)中访问a,如果没有全局域或者全局域中没有变量a,则出错;如果using指定了多个全局域,若多个全局域中有多个a,则冲突出错;如果多个全局域中只有一个定义了a,则访问a,如:

namespace name1
{
    int a = 10;
}
namespace name2
{
    int a = 20;
}
using namespace name1;
using namespace name2;
int a = 30;
int main()
{
    cout<< ::a<<endl;
    //此时访问全局变量a=30
}
namespace name1
{
    int a = 10;
}
namespace name2
{
    int a = 20;
}
using namespace name1;
using namespace name2;
int main()
{
    cout<< ::a<<endl;
    //此时访问冲突,若全局域只指定了name1或者只指定了name2,
    //则访问相应的全局域

注意

  • using可以指定多个名字空间,只要访问的变量不在多个名字空间中存在即可。
  • 名字空间可以嵌套定义,访问时也要嵌套访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值