C/C++容易迷惑问题(也属经典问题),共同学习……

来源:互联网 发布:江苏中路 知乎 编辑:程序博客网 时间:2024/04/27 14:12

一、指针的一些理解

1、const char*, char const*, char*const的区别问题几乎是C++面试中每次    都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 const
char  * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
2、指针c
int *p[n];-----指针数组,每个元素均为指向整型数据的指针。
int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。
int *p();----------函数带回指针,指针指向返回的值。
int (*)p();------p为指向函数的指针。

二、strcpy()、memset()、memcpy()的根本区别

memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为 ' '或'/0';例:char a[100];memset(a, '/0', sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0'之前)是否超过50位,如超过,则会造成b的内存地址溢出。

至于三个函数的原型不再赘述了,网上随便可以搜索到。

三、 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在main函数调用后,就开始分配,如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用户栈中动态分配的。这一点真的是学了C++三四年了不久前才理解到这个层次。

四、  析构函数和虚函数的用法和作用?
析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性 (说到多态,函数多态主要表现在重载和覆盖。这是朋友面试时别人问的问题后来提起),或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。

五、学习中出现的迷惑

("pause");系统的暂停程序,按任意键继续,屏幕会打印,"按任意键继续。。。。。" 省去了使用getchar();system

  C++的类和C里面的struct有什么区别?
c++中的类具有成员保护功能,并且具有继承,多态这类OOP特点,而c里的struct没有

头文件中的 ifndef/define/endif 是防止该头文件被重复引用。

对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h
对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h
在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”?

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字
与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

对于C++学习者真的应该抽出几分钟自己亲手写一下不调用C++/C 的字符串库函数,编写函数 strcpy()。当然一些牛人就算了。。。。。

原创粉丝点击