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

从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、newdelete 等

(编译器报警告),什么情况下完全不能修改呢,当A是加const限定且初始化的全局变量,此时A位于.rodata段(linux 下)。...作用域不同,const定义的常变量的作用域为该变量的作用域范围。...(四)、域运算符 C++中增加的作用域标识符 :: 用于对与局部变量同名的全局变量进行访问 用于表示类的静态成员,以后讲到类的时候再详谈 (五)、new、delete 运算符 (1)、new...(六)、函数重载、name managling 与extern "C" (1)、函数重载 相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload,函数重载又称为函数的多态性(...静态) 函数重载不同形式: 形参数量不同 形参类型不同 形参的顺序不同 形参数量和形参类型都不同 调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数

1.2K00

c++面试选择题_C语言经典笔试题

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。 它们都可用于申请动态内存和释放内存。...在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用: 流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。

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

    C++经典面试题(最全,面中率最高)

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。...在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用: 流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。

    2.1K30

    c++面试题

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。...在More Effective  C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。”...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用: 流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。

    1.2K21

    精选 30 个 C++ 面试题(含解析)

    在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用: 流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。...在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 3)从堆上分配,亦称动态内存分配。

    2.2K30

    深度总结了类的相关知识)(上)

    在类外定义成员时,需要使用::作用域操作符指明成员属于哪个类域。 数据成员作用域:类中的变量(成员变量)只能在类的成员函数内部或通过对象进行访问,具体取决于访问控制修饰符。...下面进一步说明作用域的影响: 成员变量的作用域 类的成员变量的作用范围仅限于类内部,外部不能直接访问它,除非它是 public 成员或者通过 public 成员函数来访问。...静态成员变量: 静态成员变量在类的所有对象中共享一份内存空间,且它们的作用域同样受访问控制修饰符的约束。...6.8 析构函数的调用 当类的对象生命周期结束时(比如在函数结束时,或调用 delete 时),系统会自动调用类的析构函数来释放对象的资源。析构函数的名字是类名前面加 ~ 号。...返回对象的引用:可以使用this指针在成员函数中返回当前对象的引用,以实现链式调用(如在操作符重载时)。

    9510

    《Effective Modren C++》 进阶学习(上)

    优先考虑限域枚举而非未限域枚举 11. 优先考虑使用deleted函数而非使用未定义的私有声明 12. 使用override声明重写函数 13....优先考虑限域枚举而非未限域枚举 首先了解未限域枚举和限域枚举: /// 未限域枚举 black, white, red 和 Color在相同作用域 enum Color { black,..., red }; 两者差异在于: 未限域枚举的枚举常量 (black、white) 与枚举类型(Color)在同一作用域;限域枚举的枚举常量(black、white)在枚举类型的作用域下...② 限域枚举的枚举名是强类型,未限域枚举中的枚举名会隐式转换为整型(现在,也可以转换为浮点类型) 11....优先考虑const_iterator而非iterator STL const_iterator等价于指向常量的指针。它们都指向不能被修改的值。

    20320

    【C++指南】C++内存管理 深度解析

    静态内存管理在程序启动时就已经将内存确定好 全局变量: 全局变量是在函数体外定义的变量。它们存储在全局 / 静态存储区。...全局变量的作用域是从定义位置开始到整个文件结束(可以通过extern关键字扩展其作用域到其他文件)。其内存空间在程序启动时就已经分配好,并且在整个程序运行期间都存在。...static_local_variable++; } 静态全局变量的作用域仅限于定义它的文件,和全局变量一样,其内存空间在程序启动时分配,直到程序结束才释放。...类型安全性: new/delete: 由于 new 和 delete 是基于类型的操作符,它们提供了更好的类型安全性。...例如: int* ptr = new int(10); delete ptr; // 这里 ptr 就成为了悬空指针,不能再使用它 3.注意内存分配失败: new操作可能会失败,返回nullptr。

    13710

    C++复习篇

    参数表不同主要有以下几种 1) 参数个数不同 2) 参数类型不同 3) 参数顺序不同 注意: 重载函数需要避免使用参数默认值 调用重载函数时,只会匹配函数参数表,与函数返回值无关 函数重载必须发生在同一个作用域中...对于public公有的静态成员变量/函数时,可以直接通过类名进行直接访问 静态成员函数中不能访问非静态成员变量,因为它属于整个类的,没有隐含this指针 示例如下: class Test{ private...)调用操作符只能通过类的成员函数重载(不能通过全局函数) 示例: class Test{ public:   void operator () (void) //通过()重载操作符,来使对象具备函数的行为...*>(&p); 24.纯虚函数vertual 在父类中用virtual声明的成员函数便为虚函数 虚函数的作用在于,能够正确调用某个同名函数是哪个类的对象 比如:当某个子类被强制转换为父类时,则父类的虚函数也会被替代为子类的...29.Qt中的智能指针 -QPointer 当其指向的对象被销毁时,本身会自动赋值为NULL(从而避免被多次释放和野指针) 缺点在于,该模板类析构时,不会自动摧毁所指向的对象(需要手工delete)

    1.3K20

    C++面试题汇总 (一)

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。...在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。  (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用:  流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。

    89720

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    程序在编译时的优先顺序:局部域->全局域->展开的命名空间域 三.函数重载 【函数重载】 是函数的一种特殊情况,C++允许在同一作用域中声名几个功能类似的同名函数显著特征:这些同名函数的形参列表...:关键字operator后面接需要重载的运算符符号 函数原型:返回值类型+operator操作符+(参数列表) 例:转化演示 注意: 不能通过连接其他符号来创建新的操作符:例如operator...@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变:例如+ 作为类成员函数重载时,其形参看起来比操作数少一个(因为成员函数的第一个参数为隐藏的this) .* / :: /sizeof...,有返回值的目的是为了支持连续赋值) 检测是否可以自己给自己赋值 返回*this:(对this指针解引用,要符合连续赋值的含义) 赋值运算符只能重载成为类的成员函数而不能重载成全局函数(如果重载成全局函数...(一般C与C++内存管理不混用) 一.使用new和delete操作符的使用规范 注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete

    25210

    分享丨CC++内存管理详解--堆、栈

    栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。...重载全局的new和delete操作符 可以很容易地重载new 和 delete 操作符,如下所示: void * operator new(size_t size){ void *p = malloc...通过重载new 和 delete 操作符的方法,你可以自由地采用不同的分配策略,从不同的内存池中分配不同的类对象。 为单个的类重载new[]和delete[] 必须小心对象数组的分配。...你可能希望调用到被你重载过的new 和 delete 操作符,但并不如此。内存的请求被定向到全局的new[]和delete[] 操作符,而这些内存来自于系统堆。...指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 (3). 指针操作超越了变量的作用域范围。

    1.1K21

    【笔记】《C++Primer》—— 第19章:特殊工具与技术

    19.1 控制内存分配 我平时有时候会说“重载new和delete”,但实际上重载这两个运算符和重载其他的运算符大不相同,准确来说实际上我们并不能重载new和delete,这需要了解new和delete...当我们重载这些函数时,我们需要定义在全局作用域或类作用域中,当我们将这些函数定义为类成员时,它们将是隐式静态的,我们无需声明static。...因为它们被运用在构造前和析构后,所以不该也不能操作任何类的成员 当我们调用new的时候,size_t参数是要分配的对象的字节数,当我们调用new[]时,参数则是数组所有元素的字节和 注意new和delete...typeid不会自动进行指针的标准类型转换,也就是当e是数组时返回的是数组类型而不是指针类型 当目标e没有虚函数时,typeid返回的是目标的静态类型,当e是定义了至少一个虚函数的类的左值时,结果会到运行时才求得...不限定作用域的成员由于作用域与类型名相同,所以可以被直接用名字访问无需指定,但是这样也引来了重复定义名称的问题 不限定作用域的枚举类的名称是可选,如果这个enum未命名,则必须在定义该enum时就定义它们的成员

    85340

    C++面向对象程序设计_Part1

    构造函数与析构函数 拷贝构造与拷贝赋值 生命期——堆,栈,静态,全局 重探new与delete 探究动态分配过程的内存块 动态分配array需要注意的问题 C++笔记主要参考侯捷老师的课程,这是一份是...操作符重载中,在public中,有四个函数,第一个是构造函数,目的是初始化复数,实虚部默认值为0,当传入实虚部时,后面的列表初始化会对private中的数据进行初始化,非常推荐使用列表初始化数据。...动态分配使用的时new命令,返回的是分配出来的内存的首地址,释放动态分配内存使用delete命令,如果分配的是数组对象,则需要在delete后加上[],如果是单个,直接delete指向的指针即可。...p所指的便是heap object,其生命在它被deleted 之际结束,所以要在指针生命结束之前对堆内存进行释放。 ? ? 上面的c2和c3分别是静态对象和全局对象,作用域为整个程序。...以下是它们四个的内存分布,更具体的细节可以参考这篇文章。 ? 重探new与delete ? ?

    97420

    C++笔试面试题整理

    失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)。...主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。...(4)流操作符重载返回值申明为“引用”的作用: 流操作符>,这两个操作符常常希望被连续使用,例如:cout 操作符的返回值应该是一个仍然支持这两个操作符的流引用...malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。...静态函数存在的意义? 静态私有成员在类外不能被访问,可通过类的静态成员函数来访问; 当类的构造函数是私有的时,不像普通类那样实例化自己,只能通过静态成员函数来调用构造函数。

    2.6K40

    CC++面试题之语言基础篇(一)

    :(int)float_variable 在C++中,有四种类型转换操作符:static_cast(float_variable) malloc/free和new/delete区别...: 6.1 malloc()与free ()是C语言的标准库函数,new/delete是C++的运算符,所以new/delete不 需要头文件进行声明; 6.2 new/delete可以调用构造函数和析构函数...简述C++从代码到可执行二进制文件.exe的过程 有四个过程,预编译、编译、汇编、链接 C++函数只声明,不定义会在哪步报错 实际的错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起时...对于C++:全局或静态对象对象首次用到时才进行构造。 静态局部变量,全局变量,局部变量的特点 首先从作用域考虑: 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。...静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。 局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。 静态局部变量 :局部作用域,只被初始化一次,直到程序结束。

    30910

    【笔记】C++面向对象高级编程

    : this指针 typename()是临时对象, 切记不可返引用 反引用还为了重载运算符的时候方便进行嵌套写法 C++的操作符都作用于左侧, 因此重载必须针对左侧的类型...., 作用域结束的时候就会被清理, 也称为自动对象 函数中定义的静态对象在函数作用域结束后依然存在, 直到程序结束 全局域定义的称为全局对象, 也属于一种静态对象, 同样到程序结束才结束 静态成员必须类外定义..., 不赋初值时静态成员为0 借助new(malloc)初始化的是堆对象, 生命直到delete才会结束, 如果指针作用域时还没有被delete, 那么就会发生内存泄漏....但是当对象不是const时, 访问数据的时候就需要拷贝一份然后返回引用以供外部安全修改了. new和delete new和delete本身是表达式, 其本身的行为是无法修改的: new: 先调用operator...我们可以重载的是operator new和operator delete函数, 且不但可以重载类成员的, 还可以重载全局的.

    91530

    网易面试杂谈

    placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)...new、placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的。...operator new就像operator+一样,是可以重载的,但是不能在全局对原型为void operator new(size_t size)这个原型进行重载,一般只能在类中进行重载。...内存的释放 如果缓冲区在堆中,那么调用delete[] buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。...3.汇编过程:把汇编语言代码翻译成目标机器指令的过程。 4.链接程序:静态链接和动态链接。

    66720

    C# 7.3新特性一览

    改进后的重载候选提案概括了这些检查: 当一个方法组既包含实例又包含静态成员时,如果调用时没有实例接收者或上下文,我们就会丢弃实例成员,如果调用时有实例接收者,我们就丢弃静态成员。...最重要的是潜在的破坏性变化: 如果有人自己编写了一个ValueTuple类型,并实现了比较操作符,之前,重载解析会找到它们。...我们移除了在会被翻译成lambda表达式主体的查询表达式子句中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个查询子句表达式。 最初增加这些限制只是因为“没有时间”。...最重要的是潜在的破坏性变化: 如果有人自己编写了一个ValueTuple类型,并实现了比较操作符,之前,重载解析会找到它们。...我们移除了在会被翻译成lambda表达式主体的查询表达式子句中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个查询子句表达式。 最初增加这些限制只是因为“没有时间”。

    1.2K30

    硬核 | C++ 基础大全

    然后使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。...new / delete ,malloc / free 区别 都可以用来在堆上分配和回收空间。new /delete 是操作符,malloc/free 是库函数。...由于 mallo/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行的构造函数和析构函数的任务强加于 malloc/free,所以有了 new/delete 操作符。...析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。当撤销对象时,编译器也会自动调用析构函数。...如果析构函数执行不全,就是没有完成他应该执行的每一件事情。 类如何实现只能静态分配和只能动态分配 前者是把 new、delete 运算符重载为 private 属性。

    1.2K10
    领券