Q1.UNICODE问题
int Test() { _TCHAR pszTemp[] = L"trend mirco"; }
sizeof(pszTemp) = ? _countof(pszTemp) = ? strlen(pszTemp) = ?
A:字符串前加L表示将字符串转化为unicode型;unicode字符串每个字符占2个字节,扩展为:"X\nX\n"的形式; 因此,sizeof(pszTemp)=24;
strlen(pszTemp)是计算从pszTemp指向的地方开始,到第一个‘\n’出现为止,一共有多少个char字符,所以strlen(pszTemp)=1;
_countof是C++中计算一个数组长度的宏,因此 _countof(pszTemp) = 12
Q2:类占用空间大小的问题
#include <stdio.h> class CS { static int n ; int m; int func(); }; main() { printf("%d", sizeof(CS)); getchar(); }
A:输出是4,static 的数据是分配在全局区;函数是放在程序代码区(专门用来存放函数的二进制代码)
Q3:
#include <stdio.h> class A { public: void f(){printf("foo");}; }; int main() { A* p = NULL; printf("---"); if(!p) { A a ; p = &a; } p->f(); getchar(); return 0; }
Q4:
#include <iostream> #include <string> class MyString: public std::string { public: MyString(const char* sz):std::string(sz){std::cout<<*this<<std::endl;} }; const size_t MAX_STRING_SIZE = 1024; /** 1)采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。 2)采用__stdcall约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。 */ MyString __stdcall MyStringCat(MyString s1,MyString s2) { char buf[MAX_STRING_SIZE]; sprintf(buf,"%s,%s",s1.c_str(),s2.c_str()); //c_str()就是得到两个指针,指向s1 s2在内存里的地址 return buf; } int main() { MyString s = MyStringCat("I hate","C"); return 0; } /** 由于函数是从右往左入站的,所以结果是: c I hate c,Ihate */
Q5:vector容器的使用方法
A:push_back(?):把?追加到vector的后面
remove_if(开始位置,结束位置,删除条件):在一个给定范围内删除满足一定条件的元素,在删除元素的过程中不改变剩余元素的位置,并同时返回一个没有要删除元素的新容器的迭代器end值。ps:erase()函数删除一个元素之后,后面的迭代器就会失效