展开

关键词

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

.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<int>(b);      在给出正确代码之前,在这个地方可以继续考察下自己有没有搞清楚上一篇说 it2=...;       这也是经常会被问到一个地方,也就是上面两个差别,这个正好和指针那个相反,也就是第一个不能修改其指向,但是可以修改其指向内容(不能++操作等等),第二个是不能修改其指向内容

36770

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

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

14030
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

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

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

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

    5310

    C++中指针和引用区别

    结果将 是不确定编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误const double &dr = dval + 1.0; 上面,同样初始化对于非const引用是不合法,将导致编译错误const引用指向需要临时对象对象或值,即,编译产生临时变量时候引用必须为const!!!! const int &ref2 = 2;// OK.编译产生临时变量,需要const引用 2.地址值是不可寻址int * const &ref3 = &a; // OK;     3.于是 ,用const对象地址来初始化一个指向指针引用 const int b = 23; const int *p = &b; const int *& ref4 = p; const int *const

    2.6K82

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

    voctor<int> v1(10); // 正确: 直接初始化 vector<int> 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; // 错误 与拷贝操作不同,编译器根本不会为某些类合成移动操作。如果一个类定义了自己拷贝构造函数、拷贝赋值运算符或者析构函数,编译器就不会为它合成移动构造函数和移动赋值运算符了。

    19640

    第 9 章 顺序容器

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

    35450

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

    37310

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

    5730

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

    21110

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

    69240

    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 只想内容和指向内容地址都已固定,不可改变

    23430

    类和对象(构造深入)

    *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知道元素类型移动函数不会抛出异常,否则在重新分配内存时候会使用拷贝构造而不是移动构造。

    19530

    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引用已经别替换为

    17120

    万字长文【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

    14420

    嵌入式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) {

    5210

    来看看这些嵌入式工程师常见面试题你会不会

    a) 一个整型数(An integer) b)一个指向整型数指针( A pointer to an integer) c)一个指向指针指针,它指向指针指向一个整型数( A pointer to 第三个意味着a是一个指向常整型数指针。 第四个意思a是一个指向整型数指针(也就是说,指针指向整型数是可以修改,但指针是不可修改)。 最后一个意味着a是一个指向常整型数指针。 并给出三个不同例子。 一个定义为volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量值了。 解释为什么。 2) 一个指针可以是volatile 吗?解释为什么。 这段代码目的是用来返指针*ptr指向平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr) {

    25320

    容易混淆const

    const最有用之处就是他来限定函数形参,这样该函数将不会修改实参指针所指数据,但其他函数却可能会修改它。 const 有哪些作用? (1)可以定义const常量,具有不可变性。    例如:const int Max=100; Max++会产生错误; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。    y; //正确,允许改变指向 *px = 3; //错误,不允许改变指针指向变量值 2)指针指向变量值可以改变,指向不可变 int x = 1; int y = 2; int* const px = &x; px = &y; //错误,不允许改变指针指向 *px = 3; //正确,允许改变指针指向变量值 3)指针指向变量值不可变,指向不可变 int x = 1; int y = 2; const int* const px = &x; int const* const px = &x; px = &y; //错误,不允许改变指针指向 *px = 3; //错误,不允许改变指针指向变量

    37710

    干货——聊聊内存那些事(基于单片机系统)

    代码区存放着程序编译CPU指令 函数名称是一个指针,可以通过查询函数名称所处内存地址,查询函数存放区域 //函数声明 void dong(); //主函数定义 int main(void) 释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放空指针例外,释放空指针其实也等于什么都没有做,所以,释放多少次都是可以),free()释放空间后可以将指针指向“NULL”确保指针不会成为野指针 void *realloc(void *ptr, size_t size) 参数 ptr -- 指针指向一个重新分配内存内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 如果为空指针,则会分配一个内存块,且函数返回一个指向指针。 size -- 内存块大小,以字节为单位。 如果大小为 0,且 ptr 指向一个已存在内存块,则 ptr 所指向内存块会被释放,并返回一个指针。 返回值 该函数返回一个指针指向重新分配大小内存。如果请求失败,则返回 NULL。

    22410

    总结---5

    如a[i]中i总被 编译器解析为偏移量,所以a[i]总是被改写成*(a+i)形式,a是指向数组第一个元素指针,加上偏移量i,表示该指针向后移i个步长,然后取 a+i所在单元内容。 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数指针(A pointer to an integer) c) 一个指向指针指针,它指向指针指向一个整型数 一个定义为volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量值了。 解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 这段代码目的是用来返指针*ptr指向平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr) { int

    353100

    扫码关注腾讯云开发者

    领取腾讯云代金券