1.如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
【标准答案】
#ifdef __cplusplus
cout<<“c++";
#else
cout<<"c";
#endif
2. C和C++有什么不同?
【参考答案】
从机制上:
c是面向过程的(但c也可以编写面向对象的程序);
c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易。
从适用的方向: c适合要求代码体积小的,效率高的场合,如嵌入式; c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。
从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比 c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++。
C语言是结构化编程语言,C++是面向对象编程语言。 C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。
关于这个问题,个人觉得《Effective C++》上面第一条说的很好,
View C++ as a federation of languages. 把C++当做一个语言联邦。
C++由四部分组成
1> C语言部分;
2> 面向对象部分,包括封装、继承、多态这些C语言所没有的特性;
3> 泛型编程部分,大多数类、函数要考虑到把它设计成模板,方便复用;
4> STL库,里面封装了大量的优秀模板,是 3> 中内容的集成, 学会使用它们可以让代码更高效。当然,最好去深入了解STL源码,那样会对C++有更深的理解。
3、STL容器
一、什么时候用STL
如果,有的时候,你要在程序中用到堆、栈、队列、链表等一些基本的算法,而你又实在不想自己去实现数据结构教科书中那些繁琐的算法,那么你就可以考虑使用STL。
另外,STL作为一种标准,便于交流,掌握它,一方面可以让你写的程序,易于让别人理解,另一方面你也能够比较容易地理解别人写的程序。
二、什么是STL
全称为 Standard Template Library ,即标准模板库
要使用STL,要了解以下几个基本概念:
- 容器:可以把它理解为存放数据的地方,常用的一些容器有 链表(list) 栈(stack) 动态数组 (vector) 双端队列(deque) 队,列(queue) 映射(map)
- 迭代器:(iterator):可以把它理解为指针类型,STL中的许多函数需要用到它们作为参数
- 算法:它们通常需要与容器和游标配合使用,使用它们,你可以方便地对容器中的数据进行各种常见的操作,如排序操作,寻找最大元素的操作等
三、主要有以下的容器
- string
- vector
- list
- set / multiset
- map / multimap
- stack queue /
- priority_queue pair
- STL 算法 <algorithm> sort等
- 迭代器 iterator 、reverse_iterator
三、STL--使用
一、容器模板的使用 大致有下面6个步骤: 1.添加相应的头文件(如 #include <list> )( 注意,没有 .h ) 2.添加std命名空间(用 using namespace std; ) 3.赋予模板具体的使用类型(如 typedef list<string> LISTSTR; ) 4.实例化模板(如 LISTSTR test; ) 5.实例化游标(如 LISTSTR::iterator i; ) 6.通过迭代器对象访问模板对象,例如 // 逐个输出链表test中的元素 二、容器模板中的常用函数 assign() 赋值 empty() 容器为空则返回非0值 erase() 删除指定位置或指定范围内的元素 push_front() 从容器头部插入元素 push_back() 从容器尾部插入元素 pop_front() 删除第一个元素 pop_back() 删除最后一个元素 back() 返回最后一个元素的引用 front() 返回第一个元素的引用 begin() 返回指向第一个元素的游标 (与迭代器配合使用) end() 返回指向最后一个元素的后一个位置的游标 (最后1个元素再加1) (与迭代器配合使用) |
4、“引用”与指针的区别是什么?
【参考答案】
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
在另一本C++著作《More Effective C++》里,第一条就是论述 point 和 reference的区别
总结一下 ,
1> 指针是一个存储地址的变量,而引用是一个变量的别名。所以在一个函数中,传引用要比传指针速度更快。
2> 指针可以指向一个空值,而引用必须初始化。指针可以如下形式出现
int *p;
是合法但不合理的(相当于是一个野指针)。
可以声明一个指向空值的指针
int *p=null
而引用不行
int &r;
是错误的
引用必须初始化为一个变量的别名,如
int a=5;
int &r=a;
3> 也是因为 2>的特性,指针在使用前要判断是否为空,而引用必定不为空(否则会报错),所以不用判断。
4> 指针可以更改指向的内存地址,而引用是和变量绑定的,不可更改。
5> 在运算符重载过程中,通常返回一个引用往往比返回一个指针更好,使用指针易引起语义上的歧义。
5.C和C++中struct有什么区别?
1> C++中的struct类似于class,有变量,有构造函数、虚函数等,有继承,多态等类的特征;
2> C中的struct只有变量,不能有函数,但是可以有函数指针
6.C++中的struct和class有什么区别?
在C++中,两者区别不大,但是有2个主要的区别
1>. 继承权限:struct默认是public继承;class默认是private继承
2>. 访问权限:struct默认是public访问;class默认是private访问
7.int id[sizeof(unsigned long)];这个对吗?为什么?
【标准答案】
正确
这个 sizeof是编译时运算符,编译时就确定了 可以看成和机器有关的常量。
8.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 ()?
A.只限某个函数 B.本文件 C.跨文件 D.不限制作用域
【参考答案】B。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
9.C++函数中值的传递方式有哪几种?
【标准答案】
C++函数的三种传递方式为:值传递、指针传递和引用传递。
(指针传递就是通常说的地址传递)
10.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
【标准答案】c用宏定义,c++用inline
define实现的函数功能容易出bug,所以在c++中最好不要使用