C++对于C语言的不同之处

本文详细对比了C++与C语言的主要不同之处,包括命名空间、struct类型的增强、类型明确性、bool类型的引入、三目运算符的增强、const关键字的功能升级、枚举的改进、引用、函数重载、默认参数和占位参数的新增,以及它们各自的特点和使用规则。

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

C++对于C语言的不同之处

这里就说一些我们常见到的,记住这些就没什么问题了

不同之处如下:命名空间 namespce 的加入、struct类型加强、所有的C++函数和变量必须明确类型(以前c语言是编译器默类型)、新增bool类型、三目运算符功能增强、const关键字功能增强、枚举的功能增强

新增之处:加入了引用、函数重载、函数默认参数和占位参数

下面详细介绍不同之处:

  1. 命名空间namespace的加入

首先我们要弄清楚什么是命名空间,它相当于是定义了c++一套标准标识符,namespce是用来确定一个变量的作用域的。

怎么说呢?我们如果在c++中没有定义 using namespace std;那么cout<<“hello”<<endl;就是错误的。因为编译器不知道cout是哪里的标识符。(编译器报错:未定义标识符cout)

所以在没有定义using namespce std;的时候,我们要输出一个hello应该是:std::cout<<“hello”<<std::endl;

这里的std::cout就是向编译器解释cout是属于标准标识库作用域里面的一个关键字。

同样using namespace std;我们一般是在文件开头书写,这是为什么呢?

#include<fstream>
void func()
{
	using namespace std;
	cout << "abcd";//没有报错
}

int main(void)
{
	
	cout << "abcd";//报错未定义标识符cout
    return 0;
}

因为using name space std;也是有作用域的,就和我们任何一个语句一样的,他的作用域也是一样的。

  1. 第二点不同之处是struct关键字的作用增强

    在语言中

    #include <stdio.h>
    struct band
    {
    	int num;
    	char name[100];
    };
    void func()
    {
    	char *temp="hello";
        band b1;//报错:error: unknown type name 'band'|
    	b1 = { 2,"hello"};
    
    
    }
    int main()
    {
    
    func();
    return 0;
    }
    

    这样会报错:不知道band是什么类型,因为c语言没有把struct定义为一个新类型的声明

    在c++中,struct是一个可以定义新类型的关键字。

    上面的代码在c++编译器中就不会报错

    3.所有的c++变量都必须初始化,没有编译器默认初始化

    例如以下代码

    #include<stdio>
    func()
    {
    
    }
    int main(void)
    {
    	func();
    	return 0;
    }

    其在c语言编译器就会编译通过,c++编译器就不行。因为c++所有类型都必须明确,func函数不明确返回值类型,c语言会默认为void返回类型,c++则会报错。

  2. 新增入了一个类型bool类型,以前在c语言编译器中想实现bool类型得自己写一个枚举如下

    typedef enum {false,true} bool;     

    c++增加了bool类型,0为假,非0为真

  3. 三木运算符在c++语言中功能得到增强

    具体看下面代码

    #include<stdio.h>
    int main(void)
    {
    	int a=1,b=2,c=3;
    	c=(a>b)?a:b;//编译通过
    	(a>b)?a:b=c;//编译报错在c编译器,编译通过在c++编译器
    
    }

    什么原因呢?因为C语言编译得三木运算符返回的是变量得值,是一个常量,不能用来做左值,而c++返回得是变量本身,可以用来做左值。(左值可以简单理解为在等号左边的值,一般只能是允许改变得值才可以做左值)

  4. const关键字得作用在c++中也得到了加强。

以前在c语言里面得定义得局部const常量只是一个由编译器维护的伪常量,我们可以通过以下代码去修改const常量。

#include <stdio.h>
int main(void)
{
	const int a=1;
	int *p=&a;
	*p=2;
	printf("a=%d",a);//c语言编译器结果为a=2;,c++结果为a=1;
	return 0;

}

上面的代码说明,在c语言里,const常量只是一个普通的由编译器维护的不能被修改的变量,而我们还是可以通过a的地址去改变a的值。a在c语言里还是存放在栈区,可以被取地址改变

在c++中,我们为什么通过a的地址改变a的值没有成功呢?因为c++里面是把所有的常量做了一个常量表,只要是出现a的地方都用a代表的const常量来替换。

那为什么我们还可以取得a的地址呢?因为c++编译器临时建立了一个变量,temp,temp=a;int p=&temp;c++编译器在后面做了这么一套动作
7.
* 枚举的语法也在c++里面得到了增强,具体如下**

   #inlcude <stdio.h>
   enum DAY
   {
   	MON,
   	TUE,
   	WED
   	THU,
   	FRI,
   	SAT,
   	SUN,
   };
   int main(void)
   {
   	enum DAY a=MON;
   	enum DAY b=0;//这在c语言中通过,在c++中不行
   
   }

二、新增之处

  1. 引用

    int a=1;
    int &b=a;
    //引用b一旦指定a,就不能修改
    int c=2;
    &b=c;//编译器会报错,说是无法修改&b
    b=c;//编译通过,因为这里相当于是 *(&a)=c;

    对于引用的使用有以下几点规则

    1. 引用其实是存储着一个变量的地址,c++编译器把a的地址赋值给了b,有b的地方,都由编译器变成了 *a

    的地址。

    1. 声 明的时候必须初始化,一经声明,不可变更。
    2. 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
    3. &符号前有数据类型时,是引用。其它皆为取地址。
  2. c++多了函数重载,和函数的形参的占位参数,默认参数

    #include<iostream>
    using namespace std;
    int func(int) {};//这里的int是占位参数,说明这里有一个int
    int func1(int a = 2)
    {
    	cout << a << endl;
    }
    
    int func1(double a = 2.0)//这里就是函数重载
    {
    	cout << a << endl;
    }
    int func2(int a = 2)
    {
    	cout << a << endl;
    }
    int main(void)
    {
    	func(1);
    	func2();//int func2(int a=2)这里没有参数输入,就默认a为2;
    	func1(3);//输出  3,有实参输入,默认参数就被替换
    	double a = 2.34;
    	int b = 3;
    	func1(a);//这里调用的是fun1(double a=2.0)
    	func1(b);//这里调用的是fun1(int a=2)
    	return 0;
    }
    

关于默认参数有以下注意点

  1. int func(in b ,int a=2),默认参数必须在形参的左边,且默认参数之后必须全是默认形参,如int func(int a=1,int b)错误,int fun(int a,int b=1,inc)//错误
  2. 默认参数当有具体实参输入时,会被覆盖

关于函数重载有以下规则

  1. 函数名相同,作用域相同
  2. 函数输入参数个数不同,或者输入参数类型不同
  3. 函数返回值的异同不能作为函数重载的条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值