09-4-9 面试 收获 弄了点C++的基础
最近忙着准备基础知识,又不时的在网上投些简历,今天接到一家网络游戏公司的面试通知,告诉我的时候,我甚至都没有把这个公司的信息在网上找到(最后确认在电话里面把名字听错了),就胡里胡涂的去了那家公司,一看傻眼了,是家游戏公司(自己虽然想从事这方面的工作,但基础不够就投得很少),一去就叫做了些笔试题,看了了题更是感觉不好,很多游戏方面的,甚至还有些Linux的,在看了题之后就打消了向这个公司奋斗的念头(只是暂时这样的),但也不能白去啊,毕竟还花了钱钱挤了公交呢,就把所有的题看了很久很久,记了一小部份,现放在这儿,增加一下印象;虽没做多少题目,但还是从中找到了很多很多的自岙不足,感觉收获还是挺大的。
结构体可以算是类的一种扩充,其内虽不能包含函数,但可以有函数指针,这样就可以方便使用函数了
,和类的区别在于,结构体中默认为Public类型,而类中默认为Private类型
CONST 和#define的区别
#define 宏名称 宏值
注意,宏定义不是C或C++严格意义上的语句,所以其行末不用加分号结束。
常量定义的格式为:
const 数据类型 常量名 = 常量值;
内存空间的分配上。define进行宏定义的时候,不会分配内存空间,编译时会在main函数里进行替换,只是单纯的替换,不会进行任何检查,比如类型,语句结构等,即宏定义常量只是纯粹的置放关系,如#define null 0;编译器在遇到null时总是用0代替null它没有数据类型(还有疑问请找C语言书籍看预处理部分或者看MSDN.而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查,所以const与define之间的区别在于const定义常量排除了程序之间的不安全性.
纯虚析构函数
析构函数,构造函数这些还是和普通的函数是不一样的。对照构造函数,派生类的构造函数必须先
调用基类的构造函数。也许你没调用过,那是因为默认情况下调用无参数的默认构造函数。类似的,析
构函数也是一样,他必然会调用基类的析构函数,不同的是,他是后调用基类析构函数的。所以基类的
析构函数必须要有函数体。基类纯虚析构函数必须要有一个空的函数体,否则无法通过编译链接。
2.结构体中的函数(C++)
既然C++在介绍类的时候说过,类是取代结构体的.可见结构体的功能并非我们平时用到的这么简单,没有太多人知道结构体中也可以有自己的函数成员.
举个例子:
#include <stdio.h>
struct DEMO
{
int m;
DEMO(int k) //构造函数
{
this->m=k;
printf("after init,m=%d\n",m);
}
void func()//一般函数
{
printf("function of struct.\n");
}
};
void main()
{
struct DEMO demo(33);
demo.func();
}
保存为test1.c , VC6.0和gcc编译都会出错. 这可能说明标准C是不支持结构体包括函数成员形式的(因为后缀.c使得VC或gcc选择c编译器). 但是如果将文件后缀改为.cpp(也就是选择c++编译或g++编译),就不再有错误了:
关于指针的问题
#include <stdlib.h>
#include <iostream.h>
#include <string>
void main()
{
cout<<sizeof(int)<<endl; //输出int型数据所占的长度4
cout<<sizeof(char)<<endl; //输出char所占的长度1
char str1[]="abc"; //为str1分配了空间,即有独立的地址
char str2[]="abc"; //为str2分配了空间,即有独立的地址
char *str3 = "abc"; //指向const char的Char*型指针
char *str4 = "abc"; //指向const char的Char*型指针
cout<<str1<<endl; //输入str1的值abc
cout<<(str1==str2)<<endl; //输出结果为0,因为两个指针的地址不一样
cout<<(str3==str4)<<endl; //输出1 原因不清楚,目前估计是因为同时Const char类型
cout<<strlen(str4)<<endl; //输出值3
cout<<sizeof(str4)<<endl; //输出值4
// cout<<str3<<endl;
// cout<<str4<<endl;
}
输出结果