anyuan2002.com - vwin网

查找: 您的方位主页 > 电脑频道 > 电脑教程 > 阅览资讯:编程言语C/C++(五)

编程言语C/C++(五)

2019-03-30 21:34:55 来历:www.anyuan2002.com 【
vwin娱乐场

1. 关于友元

- 有些状况下,答应特定的非成员函数拜访一个类的私有成员,一同仍阻挠一般的拜访,这是很便利做到的。例如被
重载的操作符,如输入或输出操作符,常常需求拜访类的私有数据成员。

友元(frend)机制答应一个类将对其非公有成员的拜访权颁发指定的函数或许类,友元的声明以friend开端,它只
能呈现在类界说的内部,友元声明能够呈现在类中的任何地方:

友元不是颁发友元联络的那个类的成员,所以它们不受其声明呈现部分的拜访操控影响。一般,将友元声明成组地放
在类界说的开端或完毕是个好主意。

1)友元函数
  - 友元函数是指某些尽管不是类成员函数却能够拜访类的一切成员的函数。类颁发它的友元特别的拜访权,这样
  该友元函数就能拜访到类中的一切成员。
  
2)友元类
  - 友元类的一切成员函数都是另一个类的友元函数,都能够拜访另一个类中的躲藏信息(包括私有成员和维护成
  员),即经过类的方针拜访类的一切成员。
  当期望一个类能够存取另一个类的私有成员时,能够将该类声明为另一类的友元类。
  
  - 关于友元类的留意事项:
    (1) 友元联络不能被承继。
    
    (2) 友元联络是单向的,不具有交流性。若类B是类A的友元,类A纷歧定是类B的友元,要看在类中是否有
    相应的声明。
    
    (3) 友元联络不具有传递性。若类B是类A的友元,类C是B的友元,类C纷歧定是类A的友元,相同要看类
    中是否有相应的声明。
    
3)友元成员函数
  - 使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就能够拜访类A的一切成员了。当用到友元成
  员函数时,需留意友元声明和友元界说之间的相互依赖,更一般的讲,有必要先界说包括成员函数的类,才干将成
  员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。
  
4)友元的小结
  - 在需求答应某些特定的非成员函数拜访一个类的私有成员(及受维护成员),而一同仍阻挠一般的拜访的状况
  下,友元是可用的。
  
  - 长处:
    - 能够灵敏地完结需求拜访若干类的私有或受维护的成员才干完结的使命;
    
    - 便于与其他不支撑类概念的言语(如C言语、汇编等)进行混合编程;
    
    - 经过运用友元函数重载能够更自然地运用C++言语的IO流库。

  - 缺陷:
    - 一个类将对其非公有成员的拜访权限颁发其他函数或许类,会损坏该类的封装性,下降该类的可靠性和
    可维护性。

2. C中printf函数核算参数时是从右到左压栈的

- 输出宽度:
  - 用十进制整数来表明输出的最少位数。若实践位数多于界说的宽度,则按实践位数输出,若实践位数少于界说
  的宽度则补以空格或0
  
  - 精度格局符以“.”最初,后跟十进制整数。本项的含义是:假如输出数字,则表明小数的位数;假如输出的是
  字符,则表明输出字符的个数;若实践位数大于所界说的精度数,则截去超越的部分。

3. 关于整型提高

- 在确认一同的方针提高类型之前,编译器将在一切小于int的整型类型上施加一个被称为整型提高的进程。

- 在进行整型提高时类型char、signed char、unsigned char和short int都被提高为类型int。假如机器上
的类型空间满意表明一切unsigned short型的值,
这一般发生在short用半个字而int用一个字的状况下,则unsigned short int也被转化成int,不然它会被提高
为unsigned int。例如已知如下的枚举类型:
  Enum status {bad,ok};
相关联的值是0和1.这两个值能够但不是有必要存放在char类型的表明中。当这些值实践上被作为char类型来存储时,
char代表了枚举类型的底层类型,然后status的整型提高将它的底层类型转化为int。

- 一旦整型提高履行完毕,类型比较就又一次开端。
  EG:unsigned char a = 0xa5;
    unsigned char b = ~a>>4+1;
    printf("%d\n",b);
  Answer:250(移位优先级小于算术运算符)

4. 关于关键字mutable

- 在C++程序中,类里边的数据成员加上mutable后,润饰为const的成员函数,就能够修正它了。

5. 关于初始化列表的初始化次序

- 初始化列表的初始化变量次序是依据成员变量的声明次序来履行的,因而需求留意一下成员变量的声明次序

6. 有关const成员(常量成员)、static成员(静态成员变量)、const static成员(静态常量成员)的初始化:

1、const成员:只能在结构函数后的初始化列表中初始化

2、static成员:初始化在类外,且不加static润饰

3、const static成员:类只要仅有一份仿制,且数值不能改动。因而,能够在类中声明处初始化,也能够像
static在类外初始化

7. 关于虚承继

- 在class B : public virtual A中,关于class B,由于class B虚承继了class A,一同还具有自己的虚
函数,那么class B中首要具有一个vfptr B(虚表指针),指向自己的虚函数表。
可虚承继该怎么完结?首要要经过参加一个虚类指针(记vbptr_B_A)来指向其父类,然后还要包括父类的一切内容。

- 虚承继是多重承继中特有的概念。虚基类是为处理多重承继而呈现的。假如类D承继自类B和类C,而类B和类C都继
承自类A,因而会呈现类D呈现了两次A。
为了节约空间,能够将B、C对A的承继界说为虚承继,而A就成了虚基类。

8. String的仿制结构函数

- 基类的结构函数、析构函数、赋值函数都不能被派生类承继。假如类之间存在承继联络,在编写上述根本函数时应
留意以下事项:
  1)派生类的结构函数应在其初始化表里调用基类的结构函数。

   2)基类与派生类的析构函数应该为虚(即加virtual关键字)。


  3)在编写派生类的赋值函数时,留意不要忘掉对基类的数据成员从头赋值。

- 类String仿制结构函数与一般结构函数的差异是:在函数入口处无需与NULL进行比较,这是由于“引证”不或许是
NULL,而“指针”能够为NULL。

- 类String的赋值函数比结构函数杂乱得多,分四步完结:
  (1)榜首步,检查自赋值。
  
  (2)第二步,用delete开释原有的内存资源。假如现在不开释,今后就没机会了,将形成内存走漏。
  
  (3)第三步,分配新的内存资源,并仿制字符串。留意函数strlen回来的是有用字符串长度,不包括完毕符
  ‘\0’。函数strcpy则连‘\0’一同仿制。
  
  (4)第四步,回来本方针的引证,意图是为了完结象a= b =c 这样的链式表达。留意不要将return *this 
  错写成return this。

9. 处理#define的时分,疏忽代码的逻辑。不论是在某个函数内,仍是在函数外,define都是从界说开端直到文件完毕。

10. 逻辑运算符两边运算方针的值假如是0,则表明假,非0就表明真,不论其类型是什么。

11. 函数内的静态变量为内部静态变量,函数外界说的静态变量为外部静态变量,外部静态变量不能用extern润饰

12. Char a=’\82’,有一个‘\’,那么首要想到的是转义字符常量,‘\ddd’ 是用八进制数的ASCII码表明一个字符,可是本题中’\82’,有一个8,明显现已不是八进制,

那么这个时分实践上就'\82'中包括3个字符,分别是‘\’,'8','2',赋值时是将字符'2'给了a(char型变量值为
1个字节长度,并从右侧开端运算,)。所以a='2',包括一个字符。

13. 为了防止同一个文件被include屡次

- #ifndef的方法依赖于宏姓名不能抵触

- #pragma once则由编译器供给确保:同一个文件不会被包括屡次。留意这儿所说的"同一个文件"是指物理上的
一个文件,而不是指内容相同的两个文件。

14. 关于左值和右值

- 非常量引证有必要是左值!

- 左值和右值都是针对表达式而言的,左值是指表达式完毕后仍然存在的耐久方针,右值是指表达式完毕时就不再存
在的暂时方针。

- 在规范C++言语中,暂时量(术语为右值,因其呈现在赋值表达式的右边)能够被传给函数,但只能被承受为
const &类型。函数形式参数是暂时量,是右值。所以只能被承受为const &类型

- 单个&只能对左值取引证,而两个&&则是对右值取引证。左值一般指的是能够在多行运用,右值一般指的是暂时变
量,只能在当时行运用。

15. 函数的回来值能够疏忽,但反常不能够疏忽

EG:void devide(int a,int b){if(b==0)throw b;~}
#try{divide(10,0);}//试着去捕捉反常
catch(int e){cout << “_”<<endl;}//反常时依据类型进行匹配,方针也是相似的操作
别的,catch(...)为捕获一切反常。

- 假如反常抛到顶层,还没有处理,那么这个时分程序会挂掉。即C++的反常机制是跨函数的,C++的反常是有必要处
理的。

16. C++反常

- 接口声明
  - 为了加强程序的可读性,能够在函数声明中列出或许抛出反常的一切类型,
  例如:void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类型的反常。

  - 假如在函数声明中没有包括反常接口声明,则此函数能够抛任何类型的反常,例如:void func()

  - 一个不抛任何类型反常的函数可声明为:void func()throw()

- 反常方针生命周期
  1)一般类型元素:反常方针catch处理完之后就析构
  
  2)引证类型元素:不必调用仿制结构,反常方针catch处理完之后就析构
  
  3)指针类型元素:假如是栈上的元素的话,反常方针在catch处理前就析构,因而只能用new在堆上分配,
  抛出,然后catch处理完之后delete。

- 一般自己写的反常类都去承继规范反常类的exception,并重写它的what函数和它的虚析构函数。

17. 关于规范输入流

- ch = cin.get()     读取一个字符
- cin.get(ch)      读取一个字符
- cin.get(str, length)   从缓冲区读取一个字符串
- cin.getline(str, length)  读取一行数据
- cin.ignore()      从缓冲区取走并疏忽当时字符(榜首个字符)
- cin.ignore(10, ‘\n’)   从缓冲区中取走并疏忽十个字符(若遇到’\n’则疏忽该字符并完毕)
- ch = cin.peek()    窃视一下缓冲区,并回来榜首个字符
- cin.putback(ch) 将字符回来缓冲区

18. 关于C/C++浮点数比较

- 除了能够表明为2的幂次以及整数数乘的浮点数能够准确表明外,其他的数的值都是近似值。例如,1.5能够准确
表明,由于1.5=3*2^(-1);可是3.6却不能准确表明,由于它并不满意这一规矩。

19. 关于规范输出流

- Cout.flush()           //改写缓冲区
- Cout.put(‘h’).put(‘l’)<<endl   //输出字符到缓冲区
- Cout.write(“hello”,len)      //二进制流的输出
- Cout.width(10)          //输出数据宽度设置
- Cout.fill(‘*’)          //改动填充的字符
- Cout.unseft(ios::dec)      //卸载当时默许的10进制输出方法
- Cout.seft(ios::oct)       //八进制输出
//经过操控符完结符号输出
-Cout << hex << setiosflags(ios::showbase) << setw(10) << setfill(‘*’) 
<< setiosflags(ios::left) <<number << endl;

20. 关于ios::binary

- 在创立文件流时,能够显现指定它的翻开方法为ios::binary,也便是以二进制方法翻开。可是,不管是否指定
二进制方法翻开文件,读写的最小单位都是字节。那么,它究竟起到什么效果呢?以二进制方法翻开与一般翻开方法
的差异是什么?

- 实践上,二者最大的差异在于对换行符的处理方法不同。由于前史原因,Windows操作体系是用两个字符(\r\n)
来表明换行符的;而Unix操作体系却是用单个字符(\n)来表明换行符的。因而,在创立文件流时,假如指定了以
ios::binary方法翻开,那么换行符便是单字符的;不然,就选用Windows操作体系的双字符。

21. 有符号数和无符号数之间的转化。

- 一般状况:
    长 -> 短:低位对齐,按位仿制。
    短 -> 长:符号位扩展。
- 精度提高:
    两个变量运算,表明规模小的变量精度向精度大的变量提高(signed -> unsigned)。

22. 柔性数组

- 编译器会以为这便是一个长度为0的数组,并且会支撑关于数组data的越界拜访。
  1*. 柔性数组,作为占位符放在结构体结尾,使得结构体的巨细动态可变,在声明结构体变量的时分可依据需
  要动态分配内存。
  
  2. 长度为0的数组并不占用空间,由于数组名自身不占空间,它仅仅一个偏移量, 数组名这个符号自身代表了
  一个不行修正的地址常量。
  
  3. 常用于网络通信中结构不定长数据包,不会糟蹋空间糟蹋网络流量。

23. 从socket读数据时,socket缓存里的数据,或许超越用户缓存的长度,怎么处理?

- 榜首种方法:能够调用realloc(),扩展原有的缓存块尺度。可是暂时请求内存的有必定功能丢失。这种状况要看
接纳缓存的方法。运用100k的大接纳缓存为例。 假如要等候数据,并进行解析。或许发生缓存不行的状况。此刻只
能扩大缓存,或先处理100k的数据,再接纳新的数据。

- 第二种方法: 运用缓存行列,分红8K巨细的行列。
不存在接纳缓存不行的状况。除非用户解析已犯错,运用数据接纳、运用脱勾。这种方法的价值是,或许需求将缓存
行列再次仿制、拼接成一块大的缓存,再进行解析。而在自己的体系中,只需求将socket接纳的数据再次原样分发给
客户,所以这种方案是最佳方案。

24. C++的虚函数有什么效果?

- 虚函数效果是完结多态,许多人都能了解这一点。但却不会答复下面这一点。

- 更重要的,虚函数其实是完结封装,使得运用者不需求关怀完结的细节。在许多规划形式中都是这样用法,例如
Factory、Bridge、Strategy形式。 
前两天在书上刚好看到这个问题,但在面试的时分却没想起来。个人觉得这个问题能够很好的区别C++的了解水平。

25. std::numeric_limit::min 回来int的最小值,std::numeric_limit::max 回来int的最大值

 
 

本文地址:http://www.anyuan2002.com/dnjc/100102.html
Tags: C++ 关于 编程言语
修改:vwin网
  • 上一篇:人工智能(机器学习)学习之路
  • 下一篇:没有了
  • 关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部