首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CC++常见面试知识点总结附面试真题—-20220326更新

同样一段代码,在c编译器下,打印结果为*pa = 4,a = 4 在c++编译下打印的结果为 *pa = 4, a = 8 int main(void) { const int a = 8;...在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?...如果用 ifndef 包含某一段宏定义,当这个宏名字出现“撞车”时,可能会出现这个宏在程序中提示宏未定义的情况(在编写大型程序时特别需要注意,因为有很多程序员在同时写代码)。...:)的结果仅仅可以作为右值,比如如下的做法在C编译器下是会报错的,但是C++中却是可以是通过的。这个进步就是通过引用来实现的,因为下面的三目运算符的返回结果是一个引用,然后对引用进行赋值是允许的。...~Stack() // s析构 执行代码的过程中调用拷贝构造,将内存中的内容逐个拷贝,在 C++ 11 中可以借助右值引用实现移动拷贝构造和移动赋值来解决这个问题。

1.6K10

【译】理解C和C++中的左值和右值

比如我们用gcc编译如下一段代码: int foo() {return 2;} int main() { foo() = 2; return 0; } 编译器将会提示: test.c...但编译器里的error字段信息的确提到了lvalue,即左值。这个术语通常不会在C和C++教程里提到。...左值和右值之间的转化 通常来说,如果要构造一个对象,需要一个右值作为参数。...结论 也许我们可以在不关心左值和右值的情况下写出很多C++代码,至多把它们当做是编译器里error信息中一些奇怪的术语。...要真正理解C++这些新特性,就必须深入理解左值和右值。 【1】右值可以被显示地赋给左值,应当使用左值的地方,右值不能被隐式地转换。 【2】C++11标准section 4.1。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++进阶】C++11的认识与学习

    使用方法:decltype() 变量 nullptr C++中 NULL 直接被定义成了0 ,没有了指针属性,为了补上这个漏洞,定义 nullptr 为空指针  三.右值引用和移动语义 什么是左值?...vs 对这块做了优化,把连续拷贝直接合为一个拷贝,这样做确实会有效率的提升,但还是要拷贝,而且换成另一个平台可能并没有这个优化,所以右值引用就出来了,极大地改善了这方面的问题。        ...   "string& operator=(string&& s) -- 移动语义"  ,但是 func  里的 str 是一个左值,并不是右值,为什么会调用移动赋值呢?...下面来看这一段代码 void Fun(int& x) { cout 值引用" << endl; } void Fun(const int& x) { cout 值引用"...statement} [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来 判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供

    16510

    《逆袭进大厂》第三弹之C++提高篇79问79答

    而const是有数据类型的,是要进行判断的,可以避免一些低级错误; 4) define预处理后,占用代码段空间,const占用数据段空间; 5) const不能重定义,而define可以通过#undef...对于可在当前源文件以外使用的函数应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。...2) 条件编译命令最常见的形式为: \#ifdef 标识符 程序段1 \#else 程序段2 \#endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段...1) C++空类的大小不为0,不同编译器设置不一样,vs设置为1; 2) C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址; 3) 带有虚函数的C++类大小不为...左值和右值 左值:表示的是可以获取地址的表达式,它能出现在赋值语句的左边,对该表达式进行赋值。

    2.2K30

    【CC++教程】关于CC++那些坑爹的破事儿,你被坑了吗?

    1 printf也风骚型 在此之前,先看一段简单得不能再简单的代码: ? 哎,这还不简单嘛?无非就是自增嘛, 第一个a输出1,第二个++a 输出2, 第三个a++用的原来的值再自增所以输出2。...由于a初始为0,a++后自增,先把值拿来用了在让a+1。 所以整个表达式可以看作是0&&2, 但是编译器坑爹啊,他读到0,然后发现,这是一个&&操作。...当他发现||左边的表达式为真(非0)时, 后面的编译器不在理会。这点大家记住。...C++不允许这么干了。 那么,你觉得下面的代码C编译器会报错吗? ? 答案是不会! 再看:这个会报错吗? ? 答案,YES! 这就很扎心了,两段代码,位置不一样,还出错了???...为什么会出现这个情况呢? 这是因为,printf输出的时候, 并不会去判断变量的类型, 他很听话,只会按照你给的格式控制符去内存中解析数据然后输出 比如整数在内存中是以补码的形式存在的。

    65720

    C++的缺陷与思考(上)

    (七)赋值语句的返回值 C/C++的赋值语句自带返回值,这一定算得上一大缺陷,在C中赋值语句返回值,在C++中赋值语句返回左值引用。...(一)宏 宏这个东西,完全就是针对编译器友好的,编译器非常方便地在宏的指导下,替换源代码中的内容。...const引用 (一)先说说const 先来吐槽一件事,就是C/C++中const这个关键字,这个名字起的非常非常不好!为什么这样说呢?...我们再来看看右值引用绑定变量的情况: 这里的关键问题在于,什么样的变量适合用右值引用绑定? 如果对于普通的变量,C++不允许用右值引用来绑定,但这是为什么呢?...”并不是“右值的引用”,而是“对需要续命的对象”的引用,生命周期变为了右值引用本身的生命周期(或者理解为“接管”了这个引用的对象,成为了一个普通的变量)。

    1.6K50

    【C++】C++11中的常见语法(上)

    C++11 中废弃 auto 原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初 始化值的类型。...什么是右值引用? 右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。...int a = 10; int& ra1 = a; // ra1 为 a 的别名 //int& ra2 = 10; // 编译失败,因为10是右值,左值不能引用右值...然后在把这个临时对象做为 Young::to_string 函数调用的返回值赋值给接收的 ret,这里调用的移动赋值。...那么为什么右值被右值引用引用以后的属性是左值呢?

    20710

    【Modern C++】深入理解移动语义

    通过对于右值(rvalue)的重新定义,语言实现了移动语义(move semantics)和完美转发(perfect forwarding),通过这种方法,C++实现了在保留原有的语法并不改动已存在的代码的基础上提升代码性能的目的...左值、右值 关于左值、右值,我们在之前的文章中已经有过详细的分享,有兴趣的同学可以移步【Modern C++】深入理解左值、右值,在本节,我们简单介绍下左值和右值的概念,以方便理解下面的内容。...具名右值引用,编译器会认为是个左值 编译器的优化需要满足特定条件,不能过度依赖 好了,截止到目前,相信你对左值引用和右值引用的概念有了初步的认识,那么,现在我们介绍下为什么要有右值引用呢?...与其他四个特殊成员函数不同,编译器生成默认的移动构造函数和移动赋值运算符需要,满足以下条件: 如果一个类定义了自己的拷贝构造函数,拷贝赋值运算符或者析构函数(这三者之一,表示程序员要自己处理对象的复制或释放问题...: 如果传递的是左值,则推导为左值引用,然后由static_cast转换为右值引用 如果传递的是右值,则推导为右值引用,然后static_cast转换为右值引用 使用move之后,就意味着两点: 原对象不再被使用

    87710

    【笔记】C++2.0新特性

    这在某些设计中会出现 这些默认函数C++本来也会自动为空类(构造函数, 拷贝构造函数, 析构函数, 拷贝赋值函数). 只有当这些函数被调用的时候才会真正出现....左值在赋值运算符左右都可以放置, 右值只能放在右侧, 如下代码: // 有名称的变量都属于左值 int x=0, y=0; // x是左值, 可以被赋值, 右边是立即数1, 是右值 x=1; // x和...将函数参数写为右值引用类型&&属于一种重载, 此时如果传递的变量是一个右值便会进入这个重载函数, 这种函数在构造函数中称为移动构造....因此我们此时知道上面代码段中pass(1)后, v的类型是int&&, pass(x)后, v的类型是int&....但是要注意VS的编译器尽管早就支持了新版本的C++但是由于设计上的问题, 直到今日这个值的定义默认依然是199711, 不过新版本的VS允许用户自己改变这个值了.

    91320

    【C++】C++11常用特性总结

    但如果是右值的拷贝或赋值呢?因为拷贝构造和拷贝赋值的参数是const左值引用,自然可以接收右值的传参,在函数内部必然还是要进行资源的重新拷贝,那是不是有点太浪费了啊?...但在C++11里面,后两行的代码效率要高于第一行,归根结底就是因为参数不再是左值,而是右值,第二行和第三行代码插入时,传参传的都是匿名对象,也就是右值,实际STL容器除实现移动构造和移动赋值外,还实现了右值引用版本的插入数据接口...知道上面的知识后,也就能解释为什么移动构造或移动赋值或右值引用版本的插入等等接口的参数都是普通右值引用了,因为这些接口都要对右值进行资源的移动,也就是改变右值引用的引用对象,所以右值引用的时候必须是普通的引用...,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。...function学起来并不困难,他其实就是将我们原来所学的可调用对象,例如函数指针,仿函数对象,lambda进行包装,使其变成一个新的可调用对象,这个可调用对象就是包装器,有人说为什么要包装啊?

    82140

    类和对象:运算符重载

    通过运算符重载,我们可以使得我们自定义的类对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。 为什么要进行运算符重载?...在学习运算符重载之前: 我们对于内置类型的运算是这样的:int = int + int; 但是我们对于自定义类型的类无法使用简单的运算符进行运算,我们需要特别得去写一个函数或者一段过程性代码来实现这个功能...这可以通过比较 this 指针和传入的右值的地址来实现。全局函数没有 this 指针,因此无法进行这种检查。 语法要求:C++ 语法要求赋值运算符 = 必须是类的成员函数。...尝试将其定义为非成员函数会导致编译错误,因为编译器期望赋值运算符是类的成员。 语义问题:赋值运算符的语义是将一个对象的值设置为另一个对象的值。...这是为了保持语言的一致性和防止潜在的错误使用。 因此,当尝试将赋值运算符重载为全局函数时,编译器会报错,因为它违反了C++的规则和赋值运算符的预期行为。

    12310

    深入理解C++11右值引用与移动语义:高效编程的基石

    可多次访问的对象 通常为表达式结果或临时值(将亡值) 4.2 左值引用和右值引用 在C++中,左值引用和右值引用是两种不同的引用类型,主要用于资源管理、性能优化和控制对象的生命周期。...为什么右值引用不直接绑定左值 右值引用的目的是为了避免拷贝,通过资源转移提升效率,而左值通常是需要继续使用的持久对象,不适合绑定到右值引用(右值引用的绑定会引导资源转移,导致左值状态不可预测)。...: 移动赋值运算符首先检查对象是否为自赋值。...为什么要使用 noexcept 通常在移动构造函数和移动赋值运算符中添加 noexcept,表示该操作不会抛出异常。...结语 右值引用与移动语义是C++11标准中的重要组成部分,它们不仅提升了程序的执行效率,也为开发者提供了更灵活的资源管理手段。在理解和掌握这些特性后,您将能够编写出更加高效和优雅的代码。

    12610

    【C++11】C++11新纪元:深入探索右值引用与移动语义

    0; } 右值引用 右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回) 等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址...; } 左操作数必须为左值,否则就会报错 int main() { // 这里编译会报错:error C2106: “=”: 左操作数必须为左值 10 = 1; x + y = 1; fmin...int a = 10; int& ra1 = a; // ra为a的别名 //int& ra2 = 10; // 编译失败,因为10是右值 // const左值引用既可引用左值,也可引用右值。...,从而变成将亡值,然后,编译器会寻找接收该对象的函数是否支持移动语义(即是否有一个接受右值引用的构造函数或赋值运算符) 代码示例 (C++): int main() { string s1("hello...,而不用开空间而节省资源,而在STL的很多容器中也够重载了右值引用 右值引用的使用可以让很多场景得到更高的效率来实现功能 移动构造,移动赋值代码示例 (string为例): // 移动构造 string

    10610

    一文入魂:妈妈再也不用担心我不懂C++移动语义了!

    一、为什么要有移动语义 (一)从拷贝说起 我们知道,C++中有拷贝构造函数和拷贝赋值运算符。那既然是拷贝,听上去就是开销很大的操作。...(二)需要移动语义的情况 既然拷贝操作没毛病,那为什么要新增移动语义呢。因为在一些情况下,我们可能确实不需要拷贝操作。...二、移动语义的实现 在了解了为什么要有移动语义之后,接着我们就该来看看它该如何实现。 (一)左值引用与右值引用 在学习如何实现移动语义之前,我们需要先了解2个概念,即“左值引用”与“右值引用”。...现在我们需要知道,以下2种情况会让编译器将对象匹配为右值引用: 一个在语句执行完毕后就会被自动销毁的临时对象; 由std::move标记的非const对象。...让编译器将对象匹配为右值引用,是一切的基础。

    1.3K20

    【C++】深入剖析C++11新特性

    C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。...什么是右值引用? 右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。...移动构造的做法十分巧妙,反正临时变量用完就是要销毁的,不如直接把他的东西拿来用,这样就节省了一次拷贝的时间。这个方法简而言之就是:转移资源的所有权(拿来吧你!)...,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。...C++中的function本质是一个类模板,也是一个包装器 那么我们来看看,我们为什么需要function呢?

    58240

    吃透这些内容,c++ 不再难学

    左值:返回左值的表达式有: 返回左值引用的函数返回值 赋值表达式 下标表达式 dereference 表达式 ++ -- 前缀 右值:返回右值的表达式有: 返回非引用类型的函数返回值 算数表达式 关系表达式...右值引用是左值。 c++ 在资源管理上有 move assign 的操作,即如果把右值赋值给其他对象,可以把右值里的资源 move 到新的对象里,这样防止进行资源的申请与释放。...面向模板编程 c++ 的泛型与 java 的泛型有所不同,实现上: java 泛型原理是编译时类型擦除,比如把 T 编译为 Object,然后运行时动态转换类型 c++ 模板原理时编译时特例化,根据模板类...、模板函数,编译生成对应类、函数的代码 所以在运行性能上,c++ 的模板性能要高于 java;在编译代码结果上,c++ 泛型编译出来的代码量要远大于 java。...比如,编译器推断 T 为 X& 时(X 指的是纯类型),我们可以用 remove_reference 得到 X。

    1.4K30

    终极 C++避坑指南

    赋值语句的返回值 C/C++的赋值语句自带返回值,这一定算得上一大缺陷,在 C 中赋值语句返回值,在 C++中赋值语句返回左值引用。...宏 宏这个东西,完全就是针对编译器友好的,编译器非常方便地在宏的指导下,替换源代码中的内容。但这个玩意对程序员(尤其是阅读代码的人)来说是极其不友好的,由于是预处理指令,因此任何的静态检测均无法生效。...左右值的概念来源于赋值表达式: var = val; // 赋值表达式 赋值表达式的左边表示即将改变的变量,右边表示从什么地方获取这个值。因此,很自然地,右值不会改变,而左值会改变。...我们再来看看右值引用绑定变量的情况: 这里的关键问题在于,什么样的变量适合用右值引用绑定? 如果对于普通的变量,C++不允许用右值引用来绑定,但这是为什么呢?...”并不是“右值的引用”,而是“对需要续命的对象”的引用,生命周期变为了右值引用本身的生命周期(或者理解为“接管”了这个引用的对象,成为了一个普通的变量)。

    2.3K20

    C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

    C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点的讲解 1.统一的列表初始化 1.1{}初始化...(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。..._capacity; } //现在我们为右值特地编写一个构造函数,右值引用就走这个了 // 移动构造 -- 右值(将亡值) string(string&& s) { cout...,右值引用本身的属性是左值 为什么这样设计?...当万能引用绑定到一个右值时,它被推导为右值引用;当绑定到一个左值时,它被推导为左值引用。这样,万能引用可以根据传入的参数的值类别来保持其原有的值类型。

    15500

    C++11新特性学习笔记

    如: int b = 1; int c = 2; int a = a + b; 在这个赋值表达式中,a就是一个左值,而b + c则是一个右值。...那么这个加法赋值表达式中,&a是允许的操作,但&(b + c)这样的操作则不会通过编译。因此a是一个左值,(b + c)是一个右值。 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。...要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。...标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。...线程 在C++11之前,C/C++一直是一种顺序的编程语言。顺序是指所有指令都是串行执行的,即在相同的时刻,有且仅有单个CPU的程序计数器执行代码的代码段,并运行代码段中的指令。

    2.2K20

    《C++中的变革力量:深入理解移动语义》

    让我们一同探索这个强大的概念。 一、移动语义的背景与需求 在传统的 C++编程中,对象的复制操作往往是通过拷贝构造函数和赋值运算符来实现的。...二、移动语义的概念与原理 移动语义是通过引入右值引用和移动构造函数、移动赋值运算符来实现的。右值引用是一种特殊的引用类型,它可以绑定到临时对象或者即将被销毁的对象。...智能指针类、文件流类等资源管理类可以利用移动语义来实现高效的资源转移和管理,提高程序的安全性和可靠性。 五、移动语义的注意事项 1. 正确使用右值引用 在使用移动语义时,要正确使用右值引用。...右值引用只能绑定到临时对象或者即将被销毁的对象,如果错误地将左值引用绑定到右值引用,可能会导致编译错误或者未定义的行为。 2. 处理移动后的对象 当一个对象被移动后,它通常处于一个可安全销毁的状态。...随着 C++的不断发展,移动语义将会在更多的领域发挥重要作用。让我们深入理解移动语义,掌握这一强大的编程工具,为构建高效、可靠的 C++程序贡献自己的力量。

    13210
    领券