c++注意事项

1.malloc不能调用构造函数  new可以,new和delete是运算符,而malloc和free是标准库函数,delete可以调用析构函数,而free不可。

2.指针数组和数组指针

int * a[4]:是指a数组里面的元素都是指针

int (*a)[4]:是指,a是个指针,指向长度为4的数组。

3.不能重载的运算符:?:   *   .*   ::  .

4.

多态由虚函数构成,多台只能通过指针和引用完成。

纯虚函数是特殊的虚函数用来规范子类的行为,在子类中必须实现或者也声明为虚函数;

抽象类是含一个或多个的纯虚函数的类,抽象类课声明指针不能声明变量;

接口是其所有的成员函数都为纯虚函数。

5.一个inline member function躯体之内的一个 data member 绑定操作会在整个class声明完成后才发生。

6.(cast)转型操作并不改变指针所含的真正地址,只影响“被指出之内存的大小和内容”的解释方式。

7.构造函数的初始化列表的初始化顺序是根据成员变量的声明循序来执行的。

8.

class A{ const  int  size = 0; };错,常亮必须在构造函数的初始化列表中初始化,或将其设置为static。

9.静态绑定和动态绑定

           只有虚函数才使用动态绑定,其他都是静态绑定。

10.析构函数可以使virtual 型,而构造函数则不能,为什么?

虚函数采用一种虚调用的方法,虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道其接口而不知道其准确对象类型的函数,如果要创建一个对象,势必要知道对象的准确类型,因此构造行数不能为虚函数。

11.析构函数可以使内联函数。

12.explicit 关键字可以消除隐式转换。

13.多态指针的一致是指“子类虚函数返回的静态类型是父类虚函数所返回的多态指针的动态类型集合中的某个类型”。

14.

系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。

用户自定义的文件用双引号括起来,编译器会先在用户目录下查找,然后到c++安装目录下查找,最后在系统文件中查找。

15.智能指针:防止程序员忘记delete出的对象,而造成内存泄漏。

std::auto_ptr:属于STL也在namespace std中,#include<memory>即可使用,智能处理单个对象,不能处理对象数组。

boost::shared_ptr属于boost库,#include<boost/smart_ptr.hpp>即可使用,也用于处理单个对象。

boost::scoped_ptr是处理对象数组。

16.static 全局变量和普通的全局变量有什么区别?

存储方式都是在常量区;普通全局变量:在各个源文件中都有效;static全局变量:只在定义该变量的源文件中有效。

17.static局部变量和普通的局部变量的区别?

生命周期不同,static只能初始化化一次下一次一句上一次的结果值。

18.static函数和普通函数的区别?

static在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

19.进程与线程的区别?

线程是指进程内的一个执行单元,也是进程内的可调度实体。

区别:

    (1)调度:线程作为调度最小单元,进程是资源分配的最小单元。

     (2)并发性:不仅进程间可以并发执行,一个进程中的多个线程间也可以并发执行。

     (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。

     (4)系统开销:在创建和撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销进程的开销。

20.数组名作为参数传递时退化为指针

21.RTTI(Run-Time type Identitification )通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际源生类型(dynamic_cast,typeid)。

22.指针和引用的区别:

   (1)指针是一个变量,里面存放的是地址,引用是变量本身。

    (2)引用在声明时必须初始化,且不能再改变。

    (3)指针初始化可以为空,且可以改变其值

    (4)指针可有多级,引用只有一级(**p合法,&&r不合法)

    (5)可以有const指针没有const引用

    (6)指针和引用++的意义不同

    (7)作为蚕食传递时,引用传递的是变量本身,指针传递的是地址。

23.静态成员函数不能直接调用非静态成员变量,不能定义为const因为const是对this指针加以修饰,但static却不用this指针。

24.常见的四种类型转换关键字:

static_cast:两个类型之间相关,例如整形之间就是这种转换。

const_cast:消除类型的const性质

reinterpret_cast:两个类型之间不相关,例如插入和int型的转换。

dynamic_cast:动态类型转换。

25.c++标准中不允许copy构造函数传值参数:因为就会造成copy构造函数中调用copy构造函数,就造成死循环。

26。

strlen(char *str) : 求字符串长度

strcpy(char *dest, char *src) : 把src拷贝到dest

strcat(char *dest, char *src) : 把src连接到dest后面

strcmp(char *s1, char *s2) : 按照各个字符(ascii)比较s1和s2,相等则返回0,否则返回ascii相减的结果

strstr(char *s1, char *s2) : 在s1中查找s2,返回找到的位置,若找不到则返回NULL

27.为节省内存,c++将常量字符串放在单独的一个内存区域,当有几个指针赋值相同的字符串常量时,指向的是同一个地址。但是常量内存初始化数组是分配的新空间,是把常量拷贝过来。

28.当类中含有const,reference时,基类的任何一个构造函数都必须有初始化列表。

29.c++不是类型安全的,因为可以进行强制类型转换(reinterpret)。

30.s[10],s和&s的值是一样的,但是两个代表的意思不同,前者表示的是数组的第一个地址,而&s表示的是整个数组。

31.栈中存放的是,局部变量,返回地址,参数,自动变量。堆中存放的是new出来的对象,全局变量,静态变量等。

32.仿函数:另名函数对象就是一个算法函数,可以生成对象作为一个函数的参数;例如sort(iter.begin(),iter.end(),greater<int>());其中greater<int>()是仿函数;STL中的仿函数分类:若以操作数个数划分可分为一元和二元仿函数,若以功能划分可分为算术运算,关系运算,逻辑运算三大类。

33.什么时候需要定义拷贝构造函数:

  (1)数据成员有指针 ;  (2) 类数据成员管理资源;

34.const限定指针类型:出现在星号左边,表示被指物是常量;出现在星号右边表示指针是常量。

35.char  c[] :分配的是一个局部数组;     char*  c:分配的是一个全局数组,内存在全局区域。

36.int (*A)[10]  ()的优先级大于[ ] ,因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针也称为行指针,它的度数是一行一行的。

     int *   A[10]  [ ]的优先级大于*,因此它是一个维数为三的数组,里面存放的是指向int的指针。

37:函数指针:

  double  (*f)():  f是一个指针,指向一个没有参数且返回double 的函数;

  double  (*f[10])(),f是一个数组,f有十个元素,元素都是函数指针,指向的函数类型是没有参数返回double的函数;

   double   (*(*f)(int,int))(int):f是一个函数指针,指向的函数是由两个int参数并返回一个函数指针的函数,返回的函数指针指向有一个int参数且返回int的函数。

38.非法指针:不仅指指向未分配的内存,还包括已经不能访问的内存,例如:指向已经返回的局部变量,越过数组边界的地址。

39.c语言中的未定义行为:是指c语言标准未作出规定的行为。例如:

   1>同一运算符中多个函数的操作数的计算顺序。int x=f()+g();如果g()中调用了f(),则两个操作数的执行顺序就会对结果有影响;

   2>函数各参数的求值顺序,同上例类似;

   3>通过指针直接修改const的值。

40.tcp的三次握手:

第一次:建立连接时,客户端发送SYN(SYN=j)包到服务器,并进入SYN_SEND状态,等待服务器确认;SYN(同步序列编号);

第二次:服务器收到一个SYN包,必须确认客户端的SYN(ack=j+1);并返回一个SYN(SYN=k),即syn+ack;此时服务器进入SYN_RECV状态;等待客户端的SYN是为了确保客户端还是活跃的,不会因为前面收到一个SYN而就此挂掉;

第三次:客户端收到SYN+ACK包,发送ACK(ACK=K+1),客户端和服务器进入ESTABLISHED状态,完成三次握手;

41.为什么进行三次握手而不是两次?(个人根据网上答案理解)

假如进行两次握手,第一次的时候SYN包在中途遇到了障碍,很久(超过时限)才到达server,server收到SYN之后确认,然后就进行数据的传输,但是因为时间很久了,这个SYN包早就已经失效了,所以数据传输就没有意义了。

42.tcp的四次挥手:

第一次:客户端发送一个FIN给服务器,用来关闭客户端和服务器之间的数据传输,告诉他我没什么东西可传了;

第二次:服务器收到FIN包之后回复一个ACK包,告诉客户端我知道了;

第三次:服务器关闭与客户端的连接并发送FIN,告诉客户端,我已经关闭了;

第四次:客户端发送发送确认ACK给服务器,告诉服务器知道了。

43.http字段的含义?

44.初始化列表必须初始化:const成员,基类构造函数,引用。  static不用初始化,因为他不是对象成员。

45.函数模板的实例化是由编译程序在处理函数调用时自动完成的;类模板的实例化必须由程序员在程序中显示的给出;函数模板仅针对函数类型不同的函数;类模板仅针对数据成员和函数成员类型不同的类;

46.批处理不能处理交互式的作业。

47.数据的逻辑结构有两个元素:一是数据元素的集合,用D表示,二是D上的关系,它反映D中元素的前后件关系,通常记为R,即一个数据结构可以表示成B=(D,R);为了反映B中元素的前后件关系,通常用二元组表示,例如,假设 a  b  D 中的两个数据,则二元组( a,b )表示 a  b 的前件, b  a 的后件。 如果一个非空的数据结构满足下列两个条件:①有且只有一个根结点;②每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构。

48.引入页式内存分配的动力是改善内存利用率,段式内存是为了满足用户需要,那么应该是引入多道序程序提高系统利用率,而基于段页式不连续的内存分配的交换技术更好地满足了多道程序的运行需要。

49._cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。

1>__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。

2>_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。

3>__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。

4>thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。

5>nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。

50.ICMP(网际控制报文协议):

包括:

1>差错报告报文:

1》终点不可达:当路由器无法为一个数据报找到路由,或者主机无法交付一个数据报时,该数据报被丢弃;

2》原点抑制:当路由器因为拥塞而丢弃数据时;

3》超时:一旦路由器将数据报的生存周期减为0,当一个报文的所有分片在某一时限内未能全部到达目的主机;

4》改变路由:当一个主机(因为主机的路由表示静态的)把数据报发送给了错误的路由器,路由器(路由器的路由表是动态的)会将此报文发送给正确的路由器,同时会发送一个改变路由的报文给主机;

5》参数问题:首部出现二义性或某个字段中缺少某个值;

             注:有四种情况不会产生ICMP差错报文:

(1)对于携带ICMP差错报文的数据;

(2)对于分片的数据如果不是第一片,不会产生;

(3)对于具有多播地址的数据报;

(4)对于具有特殊地址的数据报(127.0.0.0或0.0.0.0);

2>查询

1》回送请求与回答:确定两个系统之间是否能彼此通信;(通常用ping命令实现)

2》时间戳请求与回答:确定IP数据报在这两个机器之间来回所需要的时间;

51.ICMP的排错工具:

1>ping,能过计算往返时间;

2>traceroute:用来跟踪一个分组从源点到终点的路径;




  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值