首页
学习
活动
专区
工具
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=...;       这也是经常会被问到一个地方,也就是上面两个差别,这个正好和指针那个相反,也就是第一个不能修改其指向,但是可以修改其指向内容(不能++操作等等),第二个是不能修改其指向内容

65570

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

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

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

STL篇之vector

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

25610

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

当类中涉及到指针类型数据成员时候,往往就会产生指针悬挂问题。...浅复制 看以下结构: 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也就成了悬挂指针。...深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类对象发生复制过程时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

33910

《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.5K40

【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分配内存块...感谢你收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小

8610

【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等)可能会导致存储空间重新分配,从而使所有指向容器元素迭代器、指针和引用失效。

200

第 9 章 顺序容器

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

83250

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定义一个基本类型变量是不允许修改该变量值。

83010

关于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 类型。

49830

【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**:**在运行时识别出一个父类指针/引用指向是父类对象还是子类对象。

18320

【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 地址 , 是在内存中重新分配内存并赋值为

26620

《逆袭进大厂》之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、为什么析构函数一般写成虚函数 由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用基类析构函数,这样整个派生类对象完全被释放

1.9K10

《逆袭进大厂》之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.5K40

类和对象(构造深入)

*p << endl; // 1 2 //指向数据成员指针,是针对类,是一个偏移量 printf("%p\n", p); // 00000008 A* pA = new...三个当中,只要有一个需要自定义,意味着其他两个也要自定义! 使用 =default; 显式要求编译器生成合成默认版本 使用 =delete; 定义为删除函数。通知编译器不需要该函数。...int i = 10; int &r = i;// ok,标准左值引用 int &&rr = i;//错误,不能讲一个右值引用绑定到一个左值上 // int &r2 = i *10;//错误,i *...,不能取地址或赋值,是右值,编译错误 函数返回非引用类型时,是个临时量,所以是右值 注意:变量是左值,右值引用以后,相当于延长了临时量生命周期,此时临时量已经转换为左值了。...为了避免这样情况发生,除非vector知道元素类型移动函数不会抛出异常,否则在重新分配内存时候会使用拷贝构造而不是移动构造。

94230

Const应用与备忘

对于一般对象 如 int a=9;;我们知道它作用域是整个程序,在1.cpp和2.cpp中包含同一个定义了int a=9;头文件,因为int a=9;作用域是整个程序,所以会产生错误。...那为什么const int a=9;不会产生错误呢。原因就是const int a=9;默认作用范围是文件作用域。...即,尽管在1.cpp和2.cpp中包含同一个定义了const int a=9;头文件,但由于const int a=9;是文件作用域,包含了头文件1.cpp和2.cpp尽管都包含了const int...不会起任何作用,因为已经提示const int a = 9;是文件作用域。...i和j指向同一块内存,但是*j = 1对内存进行修改后,按道理来说,*j==1,i也应该等于1,而实验结果确实i实实在在等于0,这是为什么呢,就是本文所说内容,i是可折叠常量,在编译阶段对i引用已经别替换为

33720

AboutCPlusPlus之const关键字

引用 const int &c = a; // 正确 int *d = &a; // 错误:不能为 const 变量绑定指向 non-const 指针 const int *e = &a; //...正确 const 与 define 宏定义区别: 处理阶段不同:define 是在预处理阶段,define 常量不会编译器看到,因为在预处理阶段已经替换了;const 常量在编译阶段使用。...;编译器通常不会const 常量分配空间,只是将他们保存在符号表内,使它们成为一个编译期间常量,没有读取内存操作,效率也很高。...修饰指针变量 const 修饰指针变量有三种情况: 2.1 const 修饰指针指向内容,则内容为不可变量 const int *p = 8; const 修饰指针内容,即 *p 值不可变,只能为...2.3 cosnt 修饰指针指针指向内容,则指针指针指向内容都为不可变量 int a = 8; const int* const p = &a; 这时 p 只想内容和指向内容地址都已固定,不可改变

53630

万字长文【C++】高质量编程指南

不能对数组名进行直接复制与比较,否则会产生编译错误; 指针 p =a 并不能把 a内容复制指针 p,而是把 a地址赋给了p。...假设谋个 C函数声明如下:void foo(int x,int y) //该函数被C编译编译后在库中名字为 _foo,而C++编译器则会产生像 _foo_int_int之类名字用来支持函数重载和类型检查...0) // 错误,缺省值出现在函数定义体中 { ⋯ } 为什么?...对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省函数。...指针内容不能被修改,该返回值只能被赋给加 const修饰同类型指针 例如函数 const char * GetString(void); 如下语句将出现编译错误: char *str = GetString

1.3K20

嵌入式C语言面试题_c语言基础面试题

用变量a给出下面的定义 a) 一个整型数(An integer) b)一个指向整型数指针( A pointer to an integer) c)一个指向指针指针,它指向指针指向一个整型数(...2) 通过给优化器一些附加信息,使用关键字const也许能产生更紧凑代码。 3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变参数,防止其被无意代码修改。...一个定义为volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量值了。...解释为什么。 2); 一个指针可以是volatile 吗?解释为什么。...这段代码目的是用来返指针*ptr指向平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr) {

80110
领券