C++面试
_charles_
永不止步
展开
-
C/C++不是类型安全的!
什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序转载 2016-10-29 09:33:43 · 649 阅读 · 0 评论 -
为什么要使用非类型模板参数?
为什么要使用非类型模板参数? 1、这是因为需要才这样的,不如说:我们要实现一个堆栈,那么我们在堆栈中的数据可能是指针,字符串,整型等,那么如果没有摸板非类型参数,我们就要定义3个摸板,但是我们有了摸板非类型参数,我们就可以定义一个摸板,在定义的时候指定类型. 2、类型参数用于指定一个类型,非类型参数用于指定一个量。 有的模板可以基于类型而实例化,比如一个链表,可以装字符串对象,也可以装整数;转载 2016-10-31 11:07:23 · 1586 阅读 · 1 评论 -
默认构造函数-(无关、有关)
转:http://blog.csdn.net/hankai1024/article/details/7947989 错误认识1:若程序员没有自己定义无参数的构造函数,那么编译器会自动生成默认构造函数,来进行对成员函数的初始化。 错误认识2:编译器合成出来的default constructor会明确设定’“class内每一个data member的默认值”。但这两种种认识是有误的,不全面的。转载 2016-10-31 11:20:41 · 497 阅读 · 0 评论 -
菱形继承和虚继承
转:http://blog.csdn.net/jackystudio/article/details/17877219转载 2016-10-31 11:25:02 · 4349 阅读 · 0 评论 -
默认参数的构造函数
对于有参数的构造函数,在定义对象时必须给构造函数传递参数。实际情况中,虽然有些构造函数有参数,但其参数是不变的,这就是默认参数的构造函数。此时构造函数的形式如下:类名(函数名)(参数1=默认值,参数2=默认值,…) 构造函数中的参数与普通函数的参数是一样的,所谓的默认参数即为该参数设置一个默认的取值。可以为全部或者部分参数设置默认值。【示例4.11】 利用前面的point类,用带默认参数的构造函转载 2016-11-01 09:14:35 · 1240 阅读 · 0 评论 -
C++默认参数与函数重载 注意事项
一、默认参数 在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值。这就是默认参数; (2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。 注意: (1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在函数定义中设定。(#add ,此句意为存在函数声明转载 2016-11-01 09:37:34 · 640 阅读 · 0 评论 -
C++项目中的extern "C" {}
注意: 在C++源文件中的语句前面加上extern “C”,表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试o转载 2016-11-01 10:15:45 · 452 阅读 · 0 评论 -
static 作用?
Charles总结: 1、隐藏 2、保存内容持久 3、默认初始化为0(静态数据区默认数据是0)在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面转载 2016-11-01 11:21:55 · 328 阅读 · 0 评论 -
参数的宏、函数、内联函数的优缺点
参数宏 与 函数: 1.函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。 2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。 3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类转载 2016-11-01 11:15:17 · 511 阅读 · 0 评论 -
指针和引用 区别(引用只能在定义时被初始化一次)
Charles 对于“引用只能在定义时被初始化一次”开始不理解:int i = 10;int j = 11;int & a = i;cout << "a = " << a << endl;cout << "i = " << i << endl;a = j;//注意,这里不是被使用j的别名,是i的值被赋值成j.cout << "a = " << a << endl;cout << "i =原创 2016-11-01 14:02:33 · 3870 阅读 · 1 评论 -
C++函数中那些不可以被声明为虚函数的函数
常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。 1、为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。2、为什么C++不支持构造函数为虚函数? 这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初转载 2016-11-01 14:45:43 · 421 阅读 · 0 评论 -
不能做switch()的参数类型
C/C++中: 支持byte,char,short,int,long,bool,整数类型和枚举类型。 不支持float,double,stringJava中: boolean类型 String类型是java7开始支持转载 2016-11-01 15:08:55 · 12568 阅读 · 1 评论 -
虚析构函数(删除基类对象时,先调用派生类的虚构函数,再调用基类虚析构函数)
我们已经介绍过析构函数(详情请查看:C++析构函数),它的作用是在对象撤销之前做必要的“清理现场”的工作。当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。1、系统会只执行基类的析构函数,而不执行派生类的析构函数。如下例子 [例12.3] 基类中有非虚析构函数时的执行情况。为简化程序,只列出最必要的部分。 1. #include <iostream> 2. u转载 2016-10-31 10:48:57 · 3733 阅读 · 0 评论 -
类的成员变量 声明顺序 决定 初始化顺序(构造函数初始化列表不影响)
类成员的声明顺序决定初始化顺序; 构造函数初始化列表不影响初始化顺序;C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。class B{public: //m_b = 2,m_a = 1 B():m_a(1),m_b(m_a+1) { cout << "m_b = " << m_b << ",m_a = " << m_a转载 2016-10-31 10:33:58 · 1572 阅读 · 0 评论 -
只能用intialization list而不能用assignment
nt i, int j) : a(i), b(j) { }// 必须在这里初始化 }; int main() { A a(1,2); return 0; } (2)includeusing namespace std; class A { private: int x1; public: A(int i) { // 只有一个带参的构造函数转载 2016-10-29 09:00:30 · 1004 阅读 · 0 评论 -
C++中的四种强制类型转换的区别
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。1 static_cast用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间转载 2016-10-29 11:24:10 · 965 阅读 · 0 评论 -
分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句
零值比较–BOOL,int,float,指针变量与零值比较的if语句这是程序员面试的一道常见题,也是个C++基础问题。若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也。下文引自google搜索结果,出处不详,高手可以无视,菜菜留下,记得做好笔记。 首先给个提示:题目中要求的是零值比较,而非与0进行比较,在C++里“零值”的范围可就大了,转载 2016-10-29 11:33:36 · 6906 阅读 · 0 评论 -
如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
以下是在论坛中看到的两种解释: (1)如果是要你的代码在编译时发现编译器类型,就判断cplusplus或_STDC宏,通常许多编译器还有其他编译标志宏,#ifdef __cplusplus cout<<"c++";#else cout<<"c";#endif 如果要判断已经编译的代码的编译类型,就用nm查一下输出函数符号是否和函数名相同。(相同为c,转载 2016-10-29 21:53:29 · 560 阅读 · 0 评论 -
文件中有一组整数,要求排序后输出到另一个文件中
//文件中有一组整数,要求排序后输出到另一个文件中 #include <iostream>#include <fstream> //文件输入输出流#include <vector>using namespace std;int main(){ ifstream InFile("in.txt"); if(InFile.good()) { cout<<"o转载 2016-10-29 22:05:24 · 1612 阅读 · 0 评论 -
c++面试被问到了++i与i++的效率高低
今天做c++面试被问到了++i与i++的效率高低这个问题需要分两种情况来解说:1、当变量i的数据类型是c++语言默认提供的类型的话,他们的效率是一样的。int a,i=0; a=++i;汇编代码如下:int a,i=0;01221A4E mov dword ptr [i],0 a=++i;01221A55 mov eax,dword ptr [i] 01原创 2016-10-29 22:22:35 · 595 阅读 · 0 评论 -
C++空类编译器自动生成的6个成员函数
一、问题 在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二、详解 1、空类,声明时编译器不会生成任何成员函数 对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。 有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、转载 2016-10-30 21:01:53 · 841 阅读 · 0 评论 -
C++中复制构造函数与重载赋值操作符总结
http://www.jellythink.com/archives/378 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容:复制构造函数和重载赋值操作符的定义; 复制构造函数和重载赋值操作符的调用时机; 复制构造函数和重载赋值操作符的实现要点; 复制构造函数的一些细节。 复制构造函数和重载赋值操作符的定义我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数转载 2016-10-30 21:45:23 · 538 阅读 · 0 评论 -
1、空类的sizeof为1,为什么?
一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小。 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。add charles 空结构体:struct d{} 的sizeof也是1。 如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么siz转载 2016-10-31 08:53:20 · 7179 阅读 · 1 评论 -
实例化类,怎么限制只能在堆或栈分配!
昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?仔细想想,其实也是可以滴。 在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 1、静态建立转载 2016-10-31 09:11:02 · 1096 阅读 · 0 评论 -
类的成员函数存储方式(是否属于类的对象)
//charles测试例子class A{public: A(){cout << "A()" << endl;} ~A(){cout << "~A()" << endl;} void func(){cout<<"void func()"<<endl;} void func2() { cout<<"void func2()"<<endl;原创 2016-10-31 09:29:14 · 1843 阅读 · 0 评论 -
C语言 #define 中的UL
U和L是 整数文字量的后缀修饰,用于显示指明整数文字量的类型为unsigned int(U)和long int(L)。 类似的还有浮点数文字量的后缀修饰F 或 f,用于指明文字量表示的是一个float,而不是默认情况下的double。现在才明白UL是标记该宏长整型 十进制 数据,而不是字符,也不是int型数据。 C语言中默认宏中的数字是整型数据。 如下面的例子:#define LENGTH (转载 2016-11-01 15:21:54 · 3529 阅读 · 0 评论