C++和其他语⾔的区别
⽂章⽬录
C++新特性
1.auto类型推导
auto 关键字:⾃动类型推导,会在编译期间通过初始值推导出变量的类型,通过auto 定义的变量必须拥有初始值。
auto 关键字基本的使⽤语法如下:
auto var = val1 + val2
注意:编译器推导出来的类型和初始值的类型并不完全⼀样,编译器会适当地改变结果类型使其更符合初始化规则。
auto ⼀般会忽略顶层const,同时底层const则会保存下来。
const int ci = i, &cr = ci;
auto b = ci; //b是⼀个整数
auto c = cr; //c是⼀个整数
auto d = &i; //d是⼀个整数指针
auto e = &ci; //e是⼀个指向整数常量的指针
如果希望推断出的auto类型是⼀个顶层const,需要明确指出。
2.decltype类型推导
decltype关键字是“declare type”的缩写,和auto的功能⼀样,都⽤来在编译时期进⾏⾃动类型推导。如果希望从表达式中推断出要定义的变量类型,但是不想⽤该表达式的值初始化变量,这时就不能再⽤auto。decltype作⽤是选择并返回操作数的数据类型。
auto var = val1+val2;
decltype(val1+val2) val1 = 0;
auto根据=右边的初始值val1+val2推导出变量的类型,并将该初始值赋值给变量var,decltype根据val1+
val2表达式推导出变量的类型,变量的初始值与表达式的值⽆关。
auto要求变量必须初始化,因为它是根据初始化的值来推导出变量的类型,⽽decltype不要求,定义变量的时候可初始化也可以不初始化
3.lambda表达式
[capture list](parameter list)->return type
{
function body;
}
capture list:捕获列表,指lambda所在函数中定义的局部变量的列表,通常为空。
return type,parameter list,function body:分别表⽰返回值类型,参数列表,函数体。
4.范围for语句
for(declaration : expression)
{
statement;
}
expression:必须是⼀个序列,例如⽤花括号括起来的初始值列表,数组,vector, string等,这些类型的共同特点是拥有能返回迭代器的begin,end成员。
declaration:此处定义⼀个变量,序列中的每⼀个元素都能转化成该变量的类型,常⽤auto类型说明符。
在范围for语句中,预存了end()的值,⼀旦在序列中添加(删除)元素,end函数的值可能就会变得⽆效了
5.右值引⽤
绑定到右值的引⽤,⽤&&来获得右值引⽤,右值引⽤只能绑定到即将要销毁的对象。为了和右值引⽤区分开,常规的引⽤称为左值引⽤。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int var = 42;
int &l_val = var;
int &&r_val = var; //不能绑定到左值
int &&r_var2 = var + 40;
return 0;
}
⼀般⽽⾔,⼀个左值表达式表⽰的是⼀个对象的⾝份,⽽⼀个右值表达式表⽰的对象的值。
返回左值引⽤的函数,连同赋值,下标,解引⽤和前置递增/递减运算符,都是返回左值表达式,我们可以将⼀个左值引⽤绑定到这类表达式的结果上。
返回⾮引⽤类型的函数,连同算数,关系,位以及后置递增/递减运算符,都⽣成右值。我们不能将⼀个左值引⽤绑定到这类表达式上。左值持久,右值短暂
左值有持久的状态,⽽右值要么是字⾯常量,要么是在表达式求值的过程中,创建的临时对象。
通过右值引⽤绑定到只能绑定到临时对象,可以得知
所引⽤的对象将要被销毁
该对象没有其他⽤户
这两个特性意味着:使⽤右值引⽤的代码可以⾃由地接管所引⽤的对象的资源。
6.标准库move函数
move函数:通过该函数可以获得绑定到左值上的右值引⽤。
使⽤move函数意味着承诺,我们可以销毁⼀个移后源对象,也可以赋予它新值,但不能使⽤⼀个移后
源对象的值。
7.智能指针
8.delete函数和default函数
delete函数:表⽰该函数不能被调⽤。
default函数:表⽰编译器⽣成默认的函数,例如⽣成默认的构造函数。
#include <iostream>
using namespace std;
class A{
public:
A() = default; //表⽰使⽤默认的构造函数
~A() = default; //表⽰使⽤默认的析构函数
A(const A&) = delete; //表⽰类的对象禁⽌拷贝构造
A& operator=(const A&) = delete;//表⽰
}
int main(){
A ex1;
A ex2 = ex1; //禁⽌
A ex3;c语言和c++区别
ex3 = ex1; //禁⽌
return 0;
}
我们只能对默认构造函数或拷贝控制成员使⽤=default。
与=default不同,=delete可以对任何函数指定。
析构函数不能是删除的成员。
C和C++的区别
⾸先说⼀下⾯向对象和⾯向过程
⾯向过程的思路:分析解决问题所需的步骤,⽤函数把这些步骤依次实现。
⾯向对象的思路:把构成问题的事务分解为各个对象,建成对象的⽬的,不是完成⼀个步骤,⽽是描述某个事务在解决整个问题步骤中的⾏为。
区别和联系
语⾔⾃⾝:C语⾔是⾯向过程,它最重要的特点是函数,通过main函数来调⽤各个⼦函数,程序运⾏的顺序都是程序员事先决定好的,C++是⾯向对象的编程,类是它的主要特点,在程序执⾏过程中,先由主main函数进⼊,定义⼀些类,根据需要执⾏类的成员函数,过程的概念被淡化了,以类驱动程序运⾏,类就是对象。⾯向对象在分析和解决问题的时候,将涉及到的数据和数据的操作封装在类中,通过类可以创建对象,以事件或消息来驱动对象执⾏处理。
应⽤领域:C语⾔主要⽤于嵌⼊式领域,C++可以⽤于应⽤层开发。
C++既继承了C强⼤的底层操作特性,⼜被赋予了⾯向对象机制,它特性繁多,⾯向对象语⾔的多继承,对值传递和引⽤传递的区分以及const关键字,等等。
C++对C的增强,表现在以下⼏个⽅⾯,类型检查更为严格。增加了⾯向对象的机制,泛型编程的机制(template),异常处理,运算符重载,标准模板库,命名空间。
Java和C++区别
⼆者在语⾔特性上有很⼤的区别
指针:C++可以直接操作指针,容易产⽣内存泄漏以及⾮法指针引⽤的问题。Java并不是没有指针,虚拟机(JVM)内部还是使⽤了指针,只是编程⼈员不能直接使⽤指针,不能通过指针来直接访问内存,并且Java增加了内存管理机制。
多重继承:C++⽀持多重继承,允许多个⽗类派⽣⼀个类。JAVA不⽀持多重继承,但允许⼀个类可以继承多个接⼝,可以实现C++多重继承的功能,但⼜避免了多重继承带来的许多不便。
数据类型和类:JAVA是完全⾯向对象的语⾔,所有函数和变量都必须是类的⼀部分。除了基本数据类
型之外,其余的都作为类对象,包括数组。对象将数据和⽅法结合起来,把它们封装在类中,这样每个对象都可以实现⾃⼰的特点和⾏为。⽽C++允许将函数和变量定义为全局的。
垃圾回收
JAVA语⾔的⼀个显著的特点就是垃圾回收机制,编程⼈员⽆需考虑内存管理的问题,可以有效的防⽌内存泄漏,有效的使⽤空闲的内存。
Java所有的对象都是⽤new操作符建⽴在堆栈上,类似于C++的new操作符,但是当要释放该申请的内存空间时,JAVA⾃动进⾏内存回收操作,C++需要程序员⾃⼰释放内存空间,并且JAVA中的内存回收是以线程的⽅式在后台运⾏的,利⽤空闲时间。
应⽤场景
JAVA运⾏在虚拟机上,和开发平台⽆关,C++直接编译成可执⾏⽂件,是否跨平台在于⽤到的编译器的特性是否有多平台的⽀持。
C++可以直接编译成可执⾏⽂件,运⾏效率⽐JAVA⾼。
JAVA主要⽤来开发WEB应⽤
C++主要⽤在嵌⼊式开发,⽹络,并发编程的⽅⾯。
python和C++的区别
语⾔⾃⾝:Python为脚本语⾔,解释执⾏,不需要经过编译,C++是⼀种编译后才能运⾏的语⾔,在特定的机器上编译后运⾏。
运⾏效率:C++运⾏效率⾼,安全稳定。原因:Python代码和C++代码最终都会编程CPU指令来运⾏,但⼀般情况,⽐如反转和合并两个字符串,Python最终转换出来的CPU指令会⽐C++多很多。⾸先,Python中涉及的内容⽐C++多,经过了更多层,Python甚⾄连数字都是object,其次,Python中甚⾄连数字都是object,其次,Python是解释执⾏的,和物理机CPU之间多了解释器这层,⽽C++是编译执⾏的,直接就是机器码,编译的时候编译器⼜可以进⾏⼀些优化。
开发效率:Python开发效率⾼。原因:Python⼀两句代码就能实现的功能,C++往往需要更多的代码才能实现。
书写格式和语法不同:Python的语法格式不同于其C++定义声明才能使⽤,⽽且极其灵活,完全⾯向上层开发者。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论