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

初级程序员面试不靠谱指南(二)

.c文件,然后使用如下定义: const int Length=100; int arr[Length];      进行编译编译器会给出类似这样错误信息“expected constant expression...     可以看到它们调用函数各不相同,可以按照这个思路从编译角度理解一下为什么m1调用Set会产生错误,其产生错误原因绝对不是“从逻辑上一个const值不能被修改”,编译器完全不知道什么叫做逻辑...另外,const定义变量可以更节省内存,因为const定义内容不会在每次赋值给某个变量时都会重新分配内存,而#define定义每次都会分配一个内存。     ...指针,比如下面的代码就是错误const int b=0; int a=1; a=const_cast(b);      在给出正确代码之前,在这个地方可以继续考察下自己有没有搞清楚上一篇说...it2=...;       这也是经常会被问到一个地方,也就是上面两个差别,这个正好和指针那个相反,也就是第一个不能修改其指向,但是可以修改其指向内容(不能++操作等等),第二个是不能修改其指向内容

67570

常见c和cpp面试题目汇总(一)

,可能有多个拷贝,const所定义变量在编译时确定其值,只有一个拷贝。...3、#define定义常量是不可以用指针指向const定义常量可以用指针指向该常量地址 4、#define可以定义简单函数,const不可以定义函数 五、重载overload,覆盖override...vector就是一个动态增长数组,里面有一个指针指向一片连续空间,当空间装不下时候,会申请一片更大空间,将原来数据拷贝过去,并释放原来旧空间。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类基类指针时,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...函数调用时,值传递机制是通过“形参=实参”来对形参赋值达到传值目的,产生一个实参副本。即使函数内部有对参数修改,也只是针对形参,也就是那个副本,实参不会有任何更改。

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

    C++奇迹之旅:手写vector模拟实现与你探索vector 容器核心机制与使用技巧

    // 指向已分配内存末尾(容量终点) 3.或者我们也可以偷个懒,让编译器自己生成 //强制编译器生成默认构造函数 vector() = default; vector(const vector& v...因为这个函数只是交换内部指针,v 被声明为 const 是为了表明不会修改 v 逻辑内容(但实际上会修改 v 内部指针)。 std::swap 是标准库中模板函数,交换两个变量值。...影响: 内存重新分配会导致所有原有的指针和迭代器失效,因为 vector 内部元素被移动到新内存位置。 在内存重新分配后,原来迭代器和指针将不再有效,因为它们指向是旧内存区域。...删除元素 删除元素通常不会导致内存重新分配,但会影响迭代器有效性: erase:调用 erase 方法删除元素会使指向被删除元素迭代器失效。...在对 vector 进行赋值或移动操作时,虽然这些操作不会直接影响单个迭代器,但会对迭代器使用产生影响: 赋值操作:将一个 vector 赋值给另一个 vector,会涉及到内存重新分配和元素复制,这可能会使原有的迭代器失效

    13310

    Rust避坑现代C++悬垂指针

    代码通过智能指针管理一个整数,当智能指针被销毁后,原先获取指针仍然指向已释放内存,导致悬垂指针产生。最后,代码尝试访问这个悬垂指针指向值,展示了未定义行为可能结果。...引用有效性仍然受限于 smart_ptr 生存期,这就是为什么在后面 smart_ptr 离开作用域后使用 reference 会导致编译错误。...这个错误发生在第8行,借用检查器检测到潜在悬垂指针。这个输出体现了Rust核心优势,即通过借用检查器在编译时捕获潜在内存安全问题,而不是在运行时产生未定义行为。...在 *const i32中,* 在类型上下文中表示这是一个指针类型。const 表示这个指针指向数据是常量(不可通过此指针修改)。i32 是指针指向数据类型。...这表明我们正在访问已经被释放内存,可能是被重新分配给了其他数据。这种行为是未定义,可能导致程序崩溃或产生不可预测结果。

    24950

    STL篇之vector

    就时间而言,这是一个相对代价高任务,因为每当一个元素加入到容器时候,vector并不会每次都重新分配大小。...当val是一个内置类型时候,同样也会调用其构造函数,是的,内置类型同样是有构造函数,这是编译器为了解决上述问题对内置类型进行优化处理。...这是因为在VS上面迭代器不是一个指针,而是一个自定义类型。 但是在g++环境下,却还是可以跑。因为g++使用迭代器是一个原生指针。  ...= last) { push_back(*first); ++first; } } 当我们用n给int类型值来构造一个对象时,会发生错误。...原因是编译器会错误认为n和int一个类型,所以会调用下面的这个函数,在这个函数里面解引用last时候,就会出现问题报错了。

    28010

    第5章 | 共享与可变,应对复杂关系

    5.4 共享与可变 迄今为止,本书讨论都是 Rust 如何确保不会有任何引用指向超出作用域变量。但是还有其他方法可能引入悬空指针。下面是一个简单例子: let v = vec!...在 C++ 中,std::vector 规范会告诫你“重新分配向量缓冲区会令指向序列中各个元素所有引用、指针和迭代器失效”。...这类错误特别难以调试,因为它只会偶尔发生。在测试中,向量可能总是恰好有足够空间,缓冲区可能永远都不会重新分配,于是这个问题可能永远都没人发现。...笔记 Rust从设计之初就良好处理了数据竞争问题 Rust 共享引用与 C const 指针 乍一看,Rust 共享引用似乎与 C 和 C++ 中指向 const指针非常相似。...例如,考虑以下 C 代码: int x = 42; // int变量,不是常量 const int *p = &x; // 指向const int指针 assert

    9910

    浅复制,深复制详解下载_复制时如何跳过一部分内容

    当类中涉及到指针类型数据成员时候,往往就会产生指针悬挂问题。...浅复制 看以下结构: class A{ public: int* a; }; A a1; A b1=a1; b1=a1执行是浅复制,此时a1.a和b1.a指向是同一个内存地址...对象p2=p1执行是浅复制,p2中指针name和p1中指针name是指向同一地址,由于没有定义构造函数,在执行p2=p1时候,系统采用默认拷贝构造函数(默认拷贝构造函数不会为新对象重新分配内存空间...,造成错误,p1.name也就成了悬挂指针。...深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类对象发生复制过程时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

    35810

    《C++Primer》第十三章 拷贝控制

    voctor v1(10); // 正确: 直接初始化 vector v2 = 10; // 错误:接收大小参数构造函数是explicit 1.5 编译器可以绕过拷贝构造函数...隐式销毁一个内置指针类型成员不会delete它指向对象。但是智能指针是类类型,所以具有析构函数,因此指向对象在析构阶段会被销毁。...定义行为像指针类 令一个类实现类似指针行为最好方法是使用shared_ptr来管理类中资源你,拷贝/赋值一个shared_ptr会拷贝/赋值shared_ptr所指向指针。...int i = 42; int &r = i; // 正确, r引用i int &&rr = i; // 错误, 不能将一个右值引用绑定到左值上 int &r2 = i * 42; // 错误...与拷贝操作不同,编译器根本不会为某些类合成移动操作。如果一个类定义了自己拷贝构造函数、拷贝赋值运算符或者析构函数,编译器就不会为它合成移动构造函数和移动赋值运算符了。

    1.6K40

    【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

    malloc malloc函数是动态内存分配基础函数(从堆内存中动态分配指定大小内存块,并返回指向内存块指针)。...比如: int main() { int* p = (int*)malloc(40); return 0; } 图解: 返回值: 如果分配成功,malloc返回指向内存块void指针。...free函数⽤来释放动态开辟内存。 释放ptr指向内存块,使得操作系统可以重新利用该内存。 如果ptr为NULL或非动态内存地址,free函数不会产生错误,但也不会有任何效果。...realloc函数原型: void *realloc(void *ptr, size_t size); - ptr:要重新分配内存指针,它必须指向以前通过malloc/calloc/realloc分配内存块...感谢你收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小

    31610

    模板进阶:特化与编译链接全解析

    例如,一个通用比较函数模板可以比较大多数类型数据,但在遇到指针时,仅比较指针地址而不是指向内容,这就可能导致错误结果。模板特化允许为特定类型提供定制实现,以解决这些特殊情况下需求。...防止修改传入参数:特化版本中Date* const& left和Date* const& right,通过使用const,函数保证不会修改传入指针变量本身值,即指针指向保持不变。...但指针指向对象内容可以改变。 Date* const pDate; 在这个例子中,pDate是一个常量指针,它指向一个Date类型对象。...因此,Date* const& 意思是“指向Date对象常量指针引用”。这个引用在函数内不会改变其所引用指针对象,也不能通过引用修改指针本身指向。 已经特化类中T表示为什么?...这种方式提高了编译并行性,同时也使得代码维护更加简单,因为修改一个模块通常不会影响到其他模块编译

    13110

    指针(1)--对于指针基本概念介绍

    指针是我们学习C语言中绕不开一个话题。那么指针究竟是什么?为什么它如此重要?它用法有哪一些呢?接下来进行指针详解。 注:接下来针对指针讲解都基于C语言展开以便于更好理解。...它也有局限性, void* 类型指针不能直接进行指针+-整数和解引用运算,倘若使用编译器仍会检查出错误。...当一个指针指向对象被移动或者重新分配内存,但指针本身并没有被更新,也可能导致野指针出现。...那么如果我们使用它来赋值野指针,那么它就会指向一个无法使用地址,自然也就不会影响到其他地址使用了。实际上它自己也就成为了一个有固定指向指针从而不再是野指针,只不过这个地址是无法使用。...对于assert断言有几个优点: ·它能自动找出并且标识错误产生行号 问题出现在p != NULL,那么它就会标识出来 ·它还有⼀种无需更改代码就能开启或关闭 assert() 机制。

    8010

    第 9 章 顺序容器

    而 swap操作将容器内容交换不会导致指向容器迭代器、引用和指针失效(array和 string类型除外,它们仍然会失效)。...不会失效可以理解为只是交换了指针指向地址,指针指向值本身并没有发生变化,所以迭代器(指向原来物理内存)仍旧有效。...vector和 string 添加 如果存储空间被重新分配,则所有迭代器、指针或引用都会失效;如果未重新分配,则插入位置之前还有效,之后将会失效。...deque 添加 插入到首尾之外任何位置都会导致迭代器、指针或引用失效;如果在首位置添加元素,则迭代器会失效,指向存在元素引用和指针不会失效。...---- 9.5 额外 string操作 从一个 const char*创建 string时,指针指向数组必须以空字符结尾,拷贝操作遇到空字符时停止。

    84850

    【c++】vector模拟实现与深度剖析

    这是数组一个元素 _finish: 这个指针指向数组中最后一个实际存在元素一个位置。...这意味着它指向结束后一个元素,它用来表示存储在vector中实际元素结束 _endOfstorage: 这个指针指向分配给vector内存块末尾。...T& value = T())就不需要提供了,但是对于:vector v(10, 5);编译器在编译时,认为T已经被实例化为int,而10和5编译器会默认其为int类型就不会走vector(...,因此编译器就会将InputIterator实例化为int但是10和5根本不是一个区间,编译时就报错了故需要增加该构造方法 vector(const vector& v) 拷贝构造函数实现,只需要分配好空间对元素依次尾插即可...对于vector: 增加容器中元素(例如通过push_back、insert等)可能会导致存储空间重新分配,从而使所有指向容器元素迭代器、指针和引用失效。

    8910

    CC++ const

    下面将从七个方面总结const用法。 1.const位置 const位置较为灵活,一般来说,除了修饰一个成员函数外,const不会出现在一条语句最后。...int v1=1; int const v2=2; const int* p1; int const * p2; //以下三条语句报编译错误为什么?...前者表示指针p指向整型常变量(指针所指单元内容不允许修改),而指针本身可以指向其他常变量,即p为指向常量指针——常量指针。...p1不 是指针常量,它所指向变量类型是int const *(指向整型常量指针)。P2也不是指针常量,其指向变量类型是int* const(整型指针常量)。...若按p1=&ptr1和p2=&ptr2赋值,均产生编译错误。 2.const对象和对象const成员 const定义一个基本类型变量是不允许修改该变量值。

    85810

    关于C++ const 全面总结

    编译器能够对前者进行类型安全检查,而对后者仅仅进行字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到错误 void f(const int i) { ………} //对传入參数进行类型检查...double I=PI; //编译期间进行宏替换,分配内存double j=Pi; //没有内存分配double J=PI; //再进行宏替换,重新分配内存!...char* const pContent; (4)还有当中差别方法,沿着*号划一条线: 假设const位于*左側,则const就是用来修饰指针指向变量,即指针指向为常量; 假设const位于*右側...· 常量指针被转化成很量指针,而且仍然指向原来对象; · 常量引用被转换成很量引用,而且仍然指向原来对象; · 常量对象被转换成很量对象。...const引用; · 不论什么不会改动数据成员函数都应该声明为const 类型。

    75130

    【C++】类型转换

    这其实是因为变量 a 在定义时被 const 修饰,而编译器认为 a 不会被修改,所以编译器会将 a 值放入一个寄存器中,以后每次使用 a 都直接从该寄存器中读取,而不再从内存中读取;这就导致了我们虽然通过指针变量...,也不会产生临时对象,我们称这个过程为切片/向上转型。...int _b = 2; }; void fun(A* pa) { //当pa指向是B类时,这里就是B类型转为B类型,不会发生越界 //当当pa指向是A类时,这里就是A类型转为B类型,可能会发生越界...void fun(A* pa) { //当pa指向是B类时,这里就是B类型转为B类型,不会发生越界 //当当pa指向是A类时,这里就是A类型转为B类型,可能会发生越界 B* pb = dynamic_cast...decltype:在运行时推演出一个表达式或函数返回值类型。 dynamic_cast**:**在运行时识别出一个父类指针/引用指向是父类对象还是子类对象。

    20520

    【C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字左数右指原则 | C 语言中常量原理和缺陷 | C++ 语言中常量原理 - 符号表存储常量 )

    函数接收上述结构体类型变量作为参数 , 如果参数中 const 在 * 左边 , const Student *pS , 根据 左数右指原则 , 指针指向数据是常量 , 不能被修改 ; 下面是错误示范...pS , 根据 左数右指原则 , 指针本身是常量 , 指针指向不能被修改 ; 下面是错误示范 : // 左数右指 , const指针右边 , 指针本身指向不能被修改 int fun2(Student..., 进行了 特殊处理 ; C++ 编译器 扫描到 const int a = 10; 代码后 , 发现 const 常量 , 不会为其单独分配内存 , 而是 将 常量 a 放在 符号表 中 , 符号表...取出常量 const int a = 10 , 为其 分配一个内存空间 , 将 10 存进去 , 然后将首地址返回 赋值给指针 p ; 实际上 指针 p 指向一个内存空间 , 内存空间中值是 常量...2、代码示例 - 分析指针指向值和实际常量值 修改上述代码 , 在不同时间获取 *p 指向内存空间值 和 常量 a 值 ; 发现 使用指针 接收 常量 a 地址 , 是在内存中重新分配内存并赋值为

    46420

    《逆袭进大厂》之C++篇49问49答

    int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向一个int类型数组,这个数组大小是10。...大小是4 return 0; } 15、常量指针指针常量区别? 常量指针一个指针,读成常量指针指向一个只读变量。如int const *p或const int *p。...指针常量是一个不能给改变指向指针指针是个常亮,不能中途改变指向,如int *const p。 16、a和&a有什么区别?...宏定义和const区别 编译阶段 define是在编译预处理阶段起作用,而const是在编译、运行时候起作用 安全性 define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部内容...33、为什么析构函数一般写成虚函数 由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用基类析构函数,这样整个派生类对象完全被释放

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对干货)

    int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向一个int类型数组,这个数组大小是10。...大小是4 return 0; } 15、常量指针指针常量区别? 常量指针一个指针,读成常量指针指向一个只读变量。如int const *p或const int *p。...指针常量是一个不能给改变指向指针指针是个常亮,不能中途改变指向,如int *const p。 16、a和&a有什么区别?...宏定义和const区别 编译阶段 define是在编译预处理阶段起作用,而const是在编译、运行时候起作用 安全性 define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部内容...33、为什么析构函数一般写成虚函数 由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用基类析构函数,这样整个派生类对象完全被释放

    2.6K40
    领券