C和C++的区别

1.内联函数

常规函数在调用的时候,会使程序跳到另一个地址(常规函数的地址),并在函数结束的时候返回。如果在程序内部对常规函数进行多次调用,则会造成较大的开销。宏函数没有栈帧的开销,在预编译期的时候,宏函数就被替换为相应的代码。虽然能够进行代码的替换,但是并不会进行类型的检查,也不可以进行调试。为了解决以上问题,C++提供了内联函数。

需要注意的是内联函数是对编译器进行的建议,编译器会根据具体的情况,决定其是否内联。例如部分编译器发现该内联函数过大或者内联函数调用了自身,则不将其视为内联函数。内联函数需要在声明或者定义函数的时候在头部加上inline。

内联函数会进行类型检查并且在调用点展开,在debug版本中,会产生local符号,可以进行调试,也会进行栈帧开辟的操作,而在release版本中不产生符号,不进行栈帧开辟,不能调试。

内联函数和普通函数一样,是按照值来进行参数的传递的,这也是内联函数比宏函数更为优秀的地方。

#include <iostream>
using namespace std;

#define PRODUCT(X)(X*X)


inline int Product(int x)
{
	return x*x;
}

int main()
{
	int value1 = PRODUCT(3+4);
	cout<< value1 <<endl;


	int value2 = Product(3+4);
	cout<<value2<<endl;

        return 0;
}

 

根据结果可以看到,使用宏函数所输出的结果是19,和我们所想象的49的结果有较大的出入,这里我们就要想到宏函数仅仅进行内容的替换,替换的结果为value1 = 3+4*3+4;根据这个来计算,所得到的值就是19。如果想要得到49这个值,形式应该为value1 = PRODUCT((3+4));

2.引用变量

引用变量就相当于是某个变量的别名,在声明引用的时候必须对其进行初始化。在声明了引用之后,该引用就和变量绑定,无法成为其他变量的引用。

#include <iostream>
using namespace std;


int main()
{
	int value1=10;
	int &value2 = value1;
	++value2;
	cout<<value1<<endl;
	cout<<value2<<endl;
        ++value1;
	cout<<value1<<endl;
	cout<<value2<<endl;
        
        return 0;
}

从这个结果可以看到,value1和value2进行自增的时候,都会对变量的值造成影响。

引用可以使用在参数从实参传递给形参的过程中。如果没有使用引用,实参会先构造临时变量,再将临时变量的值传递给形参。在使用了引用之后,会直接将实参传递给函数。在函数中,对传递过去的引用的变量值进行修改,会直接影响实参的值,为了保证程序的安全性,如果没有特殊的需求,应尽量使用const与引用搭配,防止函数在运行过程中对实参的值进行修改。同理,如果参数是一个对象的话,使用引用可以直接将对象传递给函数,省去了拷贝构造的操作,在这里也应使用const防止值被修改。

3.默认参数

在函数调用的时候,如果省略了实参,则函数会自动使用的一个值。对于带参数列表的函数,必须从右向左依次添加默认值。例如int Sum(int a,int b=10,int c = 20);这种形式是合法的,从右往左依次给定默认值,没有出现两个被给定默认值的变量之间,某些变量没有被给定默认值的情况。需要注意的是函数参数的默认值不能对其进行重复赋值。

实参会按照从左往右的顺序将值依次赋值给形参,不能够跳过任何参数。

#include <iostream>
using namespace std;


int Sum(int a,int b = 10,int c = 20 )
{
	return a+b+c;
}

int main()
{
	cout<<Sum(5)<<endl;
        
        return 0;
}

实参传递的时候,按照从左往右的顺序给值,因此5这个值就赋值给了变量a,由于没有给定变量b和变量c的值,这时候就会使用默认值10和20,因此输出的结果是35.

4.重载函数

C++允许同一个作用域中,声明几个功能类似的同名函数,这些同名函数的形式参数(参数的类型、顺序、个数)必须不同。在C语言中函数符号依赖于函数名,因此C语言不支持函数重载。而C++中的函数符号依赖于函数名和函数参数生成,由于函数参数的不同会使得生成的符号有所差异,因此C++可以进行函数重载。需要注意的是不能通过返回值类型不同区分函数是否进行了重载。

在进行函数重载的时候需要遵循部分规则:

(1)不能改变运算符的优先级;

(2)不能改变运算符的结合型;

(3)默认参数不能和重载的运算符一起使用;

(4)不能改变运算符的操作数的个数;

(5)不能创建新的运算符,只有已有运算符可以被重载;

(6)运算符作用于C++内部提供的数据类型时,原来含义保持不变。

#include <iostream>
using namespace std;


int Add(int a,int b)
{
	return a+b;
}

double Add(int a,double b)
{
	return a+b;
}

int Add(int a,int b,int c)
{
	return a+b+c;
}


int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	double value = 4.4;

	cout<<Add(a,b)<<endl;
	cout<<Add(a,value)<<endl;
	cout<<Add(a,b,c)<<endl;
	
	return 0;
}

 

 

 

 

 

C语言C++在多个方面存在区别: - **编程思想**:C语言是面向过程的,如同按步骤做菜;C++则结合了面向对象泛型编程思想,可理解为定义厨师菜谱[^1]。 - **文件扩展名**:C语言源文件扩展名是 `.c`;C++源文件扩展名有 `.cpp`、`.cc` 等,头文件扩展名有 `.hpp` 等,文件后缀不同[^1]。 - **Hello World示例**:C语言使用 `printf("Hello")` 输出;C++使用 `cout << "Hello"` 输出,C语言用函数,C++用对象[^1]。 - **内存管理**:C语言使用 `malloc` `free` 进行内存分配释放;C++除了使用 `new` `delete` 外,还有智能指针,C++的内存管理更安全方便[^1]。 - **函数特性**:C语言不支持函数重载;C++支持函数重载,即同名函数可以做不同的事[^1]。 - **数据结构**:C语言主要使用结构体(`struct`);C++使用类(`class`),类相当于结构体加上方法,可看作是给结构体“添加技能”[^1]。 - **标准版本**:常用的C语言是C89标准,C++C++99标准,如今最新的是C11C++11标准,不同标准功能有所不同,且越新的版本支持的编译器越少[^2]。 - **命名空间**:C语言只有一个全局作用域,标识符可能发生冲突;C++引入了命名空间(名字空间),通过命名空间将全局作用域分成不同部分,不同命名空间里的标识符可以相同[^3]。 ### 代码示例 #### C语言 ```c #include <stdio.h> #include <stdlib.h> // 定义结构体 struct Person { char name[20]; int age; }; // 分配内存 void allocate_memory() { struct Person *p = (struct Person *)malloc(sizeof(struct Person)); if (p != NULL) { free(p); } } int main() { printf("Hello\n"); allocate_memory(); return 0; } ``` #### C++ ```cpp #include <iostream> #include <memory> // 定义类 class Person { public: char name[20]; int age; void print_info() { std::cout << "Name: " << name << ", Age: " << age << std::endl; } }; // 分配内存 void allocate_memory() { std::unique_ptr<Person> p = std::make_unique<Person>(); } int main() { using namespace std; cout << "Hello" << endl; allocate_memory(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值