C++ 牛客网做题笔记

1、运算符重载

不能被重载的运算符只有五个,分别是

1.  .  (成员访问运算符)

2.  *    (成员指针访问运算符)

3.  ::  (域运算符)

4.  sizeof  (长度运算符)

5. ?:    (条件运算符)

前两个运算符不能重载是为了保证访问成员的功能不被改变 ,域运算符和sizeof运算符的运算对象是类型而不是变量或者一般表达式,不具备重载的特征。

2、赋值运算符的优先级

算术运算符>关系运算符>逻辑运算符

举个例子: if(a+b>c && d-e<f)  不需要括号调整优先级

先加减乘除

再比较大小

最后判断真假

1   ()  []  .  ->

2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof

3   * / %

4   + -

5   >> << 

6   > >= < <=

7   == !=   

8   & 

9   ^   

10  |   

11  &&

12  ||

13  ?:

14   =  +=  -=  *=  /=   %=  |=   ^=   &=   >>=   <<=

15  ,

就着多吧   结合性:2   13  14  是从右至左   其他都是  从左至右有问题可以在交流的

口诀为

括号成员第一;        //括号运算符[]() 成员运算符.  ->

全体单目第二;        //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&乘除余三,加减四;   //这个"余"是指取余运算即%

移位五,关系六;    //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;    //即== 和!=

位与异或和位或;    //这几个都是位运算: 位与(&)异或(^)位或(|)   

"三分天下"八九十; 

逻辑或跟与;            //逻辑运算符:|| 和 &&

十二和十一;            //注意顺序:优先级(||)  低于 优先级(&&)

条件高于赋值,        //三目运算符优先级排到13 位只比赋值运算符和","高

逗号运算级最低!    //逗号运算符优先级最低

3、字符串操作常用函数

stract( 字符数组1,字符数组2)串连函数

strcpy/strncpy (字符数组1,字符数组2)复制函数

strcmp( 字符串1,字符串2)字符串比较函数

strlen( 字符数组)测字符数组函数

4、实参与形参

实参可以是任何类型(常量、变量或表达式),形参是变量,或者缺省常量,但不能是表达式

5、

编译不通过主要是语句 this=NULL; 

因为类的构造函数中,this 指针的形式为Myclass *const this; 它是一个常量指针,指针的指向不能修改。

6、

A:下面列举的几种情况不能省略模板实参:
1)从模板函数实参表获得的信息有矛盾之处。
2)需要获得特定类型的返回值,而不管参数的类型如何。
3)虚拟类型参数没有出现在模板函数的形参表中。
4)函数模板含有常规形参。
B:类模板与模板类的概念

⑴ 什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

  如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。

⑵ 模板类是类模板实例化后的一个产物。可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。

类模板的重点是模板。表示的是一个模板,专门用于产生类的模子。 模板类的重点是类。表示的是由一个模板生成而来的类。 

C:类模板有三种类型模板参数:类型模板参数、无类型模板参数和模板模板参数(以模板作为模板的参数)。并不局限于虚拟类型,非虚拟类型也可以作为类模板参数。

7、大端与小端

0x1234

0x12:高位

0x34:低位

结构体中,先声明的是低地址,后声明的是高地址

m:低地址

n:高地址

大端:低位放在高地址:0x34---->n

小端:高位放在高地址:0x12---->n

x.z.n表示联合体x中结构体z内的变量n

8、C语言中for(;;)是什么意思?

该循环是死循环,for后的圆括号中,第一个分号前的内容是执行第一次循环前执行的,第二个分号前的内容是每次执行前都要判断的(如果该处表达式的值为真,那么执行循环体,如果为假,那么就跳出循环体),第二个分号后的内容是每执行完一次循环体后执行的。 停止的方法在循环体中使用break跳出循环体。

9、C语言中%d,%o,%f,%e,%x的意义

格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。 
格式字符有d,o,x,u,c,s,f,e,g等。 

%d整型输出,%ld长整型输出,

%o以八进制数形式输出整数,

%x以十六进制数形式输出整数,

%u以十进制数输出unsigned型数据(无符号数)。

%c用来输出一个字符,

%s用来输出一个字符串,

%f用来输出实数,以小数形式输出,

%e以指数形式输出实数,

%g根据大小自动选f格式或e格式,且不输出无意义的零。

scanf(控制字符,地址列表) 
格式字符的含义同printf函数,地址列表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。如scanf("%d%c%s",&a,&b,str);


10、c ++中对构造函数有一些规定:

不能带返回值;可以不带参数;也可以缺省定义;构造函数的名字与类名必须完全相同。注意:构造函数可以进行重载,析构函数不可以

 11、

若const限定符在*之前,则const限定的是*ptr而不限定ptr。也就是说,ptr可以改变其所指向的对象,但不能通过该指针修改其所指向对象的值。

若const限定符在*之后,则const限定的是ptr而不限定*ptr。也就是说,ptr不可以改变其所指向的对象,但能通过该指针修改其所指向对象的值。

若在*之前有const限定符且在*之后也有const限定符,则ptr与*ptr都被限定。也就是说,ptr既不可以改变其所指向的对象,也不能通过该指针修改其所指向对象的值。

另外:只要 在*之后有 const限定符,则该指针在声明时必须初始化。

12、

fprintf函数只能以字符串的形式写入到文件中;fread函数则是从文件中读数

据,而不是写数据;fputc函数是以字符的形式写到文件中:而fwrite函数则是将某数以其

机器数的形式写入到文件中。

13、运算符&与&&,|与||的区别

(1)逻辑与当&与&&同为逻辑运算符时,它们都用于连接两个Boolean类型的表达式,当&和&&的两端表达式同时为真时,表达式的结果为真,只要有一端为假,那么表达式结果为假。

 逻辑运算符&与&&的区别是:

            & 无论左边结果是什么,右边还是继续运算;

            &&当左边为假,右边不再进行运算。

            但是两者的结果是一样的。

当|和||的两端表达式同时为假时,表达式的结果为假,只要有一端为真,那么表达式结果为真。

            所以同理,我们可以知道|与||的区别:

             | 无论左边结果是什么,右边还是继续运算;

            ||当左边为真,右边不再进行运算。

              但是两者的结果是一样的。

            所以&&和||是比较高效那么一点点。

(2)按位与&,双目运算符:将两个表达式的值按二进制位展开,对应的位(bit)按值进行“与”运算,结果保留在该位上…
                                  比如170&204
                                  对应二进制就是
                                   10101010B
                                   &11001100B
                                   =10001000B…
该位只要有一个值为0结果为0,否则结果为1。

14、C 语言中的文件类型只有( ASCII码文件和二进制文件两种)

从文件编码的方式来看,文件可分为ASCII码文件(文本文件)和二进制文件两种。ASCII码文件可在屏幕上按字符显示的,例如源程序文件就是ASCII码文件,由于按字符显示,可以识别;二进制文件是按二进制的编码方式来存放文件的,二进制文件虽然也可以在屏幕上显示,显示为乱码。 

15、string中length()和size()的区别

c++中的size()和length()没有区别

如:
string str="hello world";
cout <<"str.length()="<<str.length()<<endl;//结果为12
cout <<"str.size()="<<str.size()<<endl;//结果为12
为了兼容,这两个函数一样。 length()是因为沿用C语言的习惯而保留下来的,string类最初只有length(),引入STL之后,为了兼容又加入了size(),它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。 string类的size()/length()方法返回的是字节数,不管是否有汉字。


16、C/C++库函数(tolower/toupper)实现字母的大小写转换

                 tolower(s) == tolower(str[i])

17、如何利用c++ cout如何输出不同进制,二进制需要自己编写函数

cout<<hex<<i<<endl; //输出十六进制数
cout<<oct<<i<<endl; //输出八进制数
cout<<dec<<i<<endl; //输出十进制数

18、强制类型转换


强制类型转换运算是一种严格取整运算,它的原则不是四舍五入,对于小数,最后的返回都会是整数部分,在C语言中强制类型转换是用括号加类型符如(int)a,标准C++的强制类型转换是static_cast<int>(a);

19、函数调用进行读写操作命令

fopen("A:\\user\\abc.txt","r+")

打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作

r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

rb+ 读写打开一个二进制文件,只允许读写数据。

rt+ 读写打开一个文本文件,允许读和写。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

wb 只写打开或新建一个二进制文件;只允许写数据。

wb+ 读写打开或建立一个二进制文件,允许读和写。

wt+ 读写打开或着建立一个文本文件;允许读写。

at+ 读写打开一个文本文件,允许读或在文本末追加数据。

ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

20、%取余运算是二目运算符,且要求运算对象必须为整数

猜你喜欢

转载自blog.csdn.net/qq_23304241/article/details/85128222