牛客选择题刷题总结——C++篇(更新ING)


1、模板函数和强制类型转换问题

  • 模板函数的定义:

        template

        T fun(T x,T y)

      {

          return x*x + y*y;

      }

  • 对于模板函数的调用,类型需要一致 

      fun(1, 2)     

     fun(1.0, 2)   

     fun(1,2.0)   对(为强制类型转换,后面的实参会强制转换成为float类型,因此类型也是一致的)


   2、定义数组时,元素个数参数的表达问题

        一维数组的定义方法:     元素类型 数组名[E];

       其中E只能是整型常量表达式。

        例如: int a[2];

                   但是这样就不可以:int x=2, y=3;  int a[x+y];                   错误的定义

                   这样就对了:const int x=2, const int y=3; int a[x+y];       正确的定义  


3、 多态(静态绑定和动态绑定

  • 面向对象有三种特性:封装,继承,多态。其中多态性有两种:

       1)一种是依靠函数重载实现的静态绑定

       2)一种是依靠虚函数实现的动态绑定,动态绑定跟对象的引用类型无关,他会根据具体的对象调用对                                                应的方法。

  • 什么是静态绑定和动态绑定,他们有什么区别?

                                               定义

       静态类型:对象在声明时采用的类型,在编译期既已确定;

       动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;

       静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期

       动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期

                                                  区别

      1)静态绑定发生在编译期,动态绑定发生在运行期;

      2)对象的动态绑定类型可以更改,但是静态绑定类型无法更改;

      3)要想实现动态,必须使用动态绑定;

      4)在继承体系中只有虚函数使用的是动态绑定,其他的全是静态绑定。


4、二维数组指针

例如: int Sec[2][3] = {4,6,3,7,2,7};

            int **p = Sec;

  •  **p   所等价的就是  Sec[0][0]
  •   *p         等价          Sec[0]  
  •   *(p+n)    等价         Sec[n]
  •   *(*(p+n)+m)  等价     Sec[n][m]
  •   p+1  就是二维数组加一行
  • *p+1执行p所指向行数的下一个元素

5、结构体字节数计算

                                                                               需要按照高位对齐来进行计算

   例:struct X { short s; int i; char c; }  

          则sizeof(X) 值为:因为int占四个字节,short占两个字节,char占一个字节,所以他们都应该满足高位对齐即:4+4+4=12

          sizeof(X)=12;


6、判断一个双精度浮点数

     if(abs(f) <= 1e-15);


7、C++语言能否定义字符串变量?

  •  对于C与C++来说是没有字符串这种数据类型的
  • 只是可以通过字符数组 或  指向字符的指针 或 C++的标准库string来实现存储字符串,但是这并不能称作定义了字符串变量

8、对于double类型的舍入误差

  例题:

   以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()。

        A、2的平方根         
        B、10的30次方             
        C、0.1                        
        D、0.5       
       E、100

解析:

A. 2的平方根,本身就是无限小数,因此肯定有舍入误差

B. 10的30次方,明显超出了double的数据存储范围(10^30 > 2^64),故有舍入误差

C. 0.1不能用2的负整数次方来表示,因此有误差

D. 0.5 = 2^(-1),因此没有误差

E. 100的二进制表示是:0110 0100,因此没有误差


9、putchar、getchar、puts、gets的运用

(1)使用getchar()函数取得使用者输入的一个字符

#include 
int main()
{
    char a,b;
    a=getchar();
    b=getchar();
    putchar(a);  
    putchar(b);
    putchar('\n');
    return 0;
}

得到的结果

牛客选择题刷题总结——C++篇(更新ING)_第1张图片

 

(2)使用putchar()输出一个字符

#include 
int main()
{
    char a1='A',b1='B';
    int a2=65,b2=66;
    putchar(a1);
    putchar(b1);
    putchar('\n');   //换行符也是一个字符
    
    putchar(a2);  //输出为A,即该函数会自动强制转化为char型
    putchar(b2);
    putchar('\n');
    return 0;
}

输出结果

牛客选择题刷题总结——C++篇(更新ING)_第2张图片

 

(3)使用gets()获得输入的整个字符串,使用puts()输出整个字符串

#include 
#include

int main()
{
	char a[20];
	puts("输入的字符是:");
	gets(a);
	puts("存入的字符是:");
	puts(a);
	system("pause");
	return 0;
}

输出显示结果: 

牛客选择题刷题总结——C++篇(更新ING)_第3张图片

 


10、类型(int、float、double)的自动转换

      如果int型与float型与double型进行运算,则把int型和float型转换为double类型,然后进行运算,结果是double类型,具体转换如下:

                                                                      牛客选择题刷题总结——C++篇(更新ING)_第4张图片

 


11、 在结构化程序设计中,模块划分的原则是:
       模块内具有高内聚度(类的内部操作细节自己完成,不允许外部干涉),模块间具有低耦合度(仅暴露少量的方法给外部使用),即高内聚、低耦合


12、运算符优先级

运算符优先级顺口溜:淡云一笔,鞍落三服。

淡:单目运算符;

云:算数运算符;

一:移位运算符;

笔:比较运算符;

鞍:按位运算符;

落:逻辑运算符;

三:三目运算符;

服:赋值运算符。


13、C\C++语言中,函数值的返回类型

  • C语言:如果函数未指定任何返回值类型,则默认为int
  • C++语言:如果一个函数没有返回值,返回值类型必须指定为void

14、‘\0‘的解释

  • c语言中'\0'不是空格,是空字符串。
  • '\0' 是字符常量,NULL 字符,ASCII码数值0,用作字符串结尾符。
  • '\0' 是字符串,里面有一个写入的字符串结尾符,还有一个默认的字符串结尾符。
  • '\0' 字符串长度是0, 占内存 2 字节。

15、malloc()函数、calloc()函数、realloc()函数、new运算符

  • malloc()函数:void *malloc(unsigned int size)

     在内存的动态空间分配区域中分配一个长度为size的连续空间,如果分配成功,则返回分配内存空间的首地址;否则返回           NULL,申请的内存不会进行初始化

  • calloc()函数:void *calloc(unsigned int num,unsigned int size)

   按照所给的数据个数和数据类型所占的字节数,分配一个  num*size连续的空间calloc()函数申请内存空间后,会自动初始化内存空间为0,但是malloc()不会进行初始化,其内存空间存储是一些随机数据。

  • realloc()函数:void *realloc(void *ptr, unsigned int size)

动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size,申请的内存空间不会进行初始化。

  • new

new是动态分配内存的运算符,自动计算需要分配的内存,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。


16、友元函数和成员函数重载运算符

  • 友元函数重载运算符时:参数列表为0,说明重载错误;参数列表为1,说明是一元运算符;参数列表为2,说明是二元运算符;
  • 成员函数重载运算符时:参数列表为空,说明是一元运算符;参数列表是1时,说明是二元运算符;

你可能感兴趣的:(牛客刷题)