趋势科技南京笔试--C++部分_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 趋势科技南京笔试--C++部分

趋势科技南京笔试--C++部分

 2012/10/15 10:40:47  Iam42  程序员俱乐部  我要评论(0)
  • 摘要:Q1.UNICODE问题intTest(){_TCHARpszTemp[]=L"trendmirco";}sizeof(pszTemp)=?_countof(pszTemp)=?strlen(pszTemp)=?A:字符串前加L表示将字符串转化为unicode型;unicode字符串每个字符占2个字节,扩展为:"X\nX\n"的形式;因此,sizeof(pszTemp)=24;strlen(pszTemp)是计算从pszTemp指向的地方开始,到第一个‘\n’出现为止,一共有多少个char字符
  • 标签:笔试 c++

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;
}
  1. 每一个非虚成员函数实际上都等同于一个普通的C函数,其中第一个参数为对象指针,即我们常说的this指针。例如:??
  2. ??
  3. 上面的A的function函数实际等同于:<SPAN?style="COLOR:?#ff0000">A::Function()???==================èFunction(A*this);??
  4. ??
  5. </SPAN>与此不同,对每一个虚成员函数的调用都是通过虚函数表的虚指针vptr来进行调用的,如上面的p2->function一句将被编译器解释为:??
  6. ??
  7. ???????????????????????????????????????(*?p2->vptr[1]?)(p2)??
  8. ??
  9. 很容易理解,虚函数的调用是动态决定的。也很容易理解,21行crash,18行正常。很显然,如果在A类的成员函数function里,有去使用成员变量,该函数同样会crash??

?

?

?

?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()函数删除一个元素之后,后面的迭代器就会失效

发表评论
用户名: 匿名