• 程序员面试宝典笔记


    目录

    第六章

    1、sizeof()关键字

    第十一章 接口与继承

    1、覆盖

    2、虚继承

    第十二章位运算与嵌入式编程

    1、位值转换

    2、int、float等占的字节数

    3、const变量和const指针

    4、处理器字长和编写十六进制的unsigned int型变量时候应该注意的问题

    5、malloc()参数为0出现的情况

    第六章

    1、sizeof()关键字

    (1)、空类的大小是1---相当于一个char做了一个标记,标记这个类的地址是唯一的

    1 class A {
    2 };
    3 sizeof(A)=1

    (2)类中只有构造函数函数,类的大小也是1

    1 class A {
    2 public:
    3     A(){}
    4 };
    5 sizeof(A)=1

    (3)类中只有函数,类的大小也是1

    1 class A {
    2 public:
    3     A(){}
    4     void fun(){}
    5 };
    6 sizeof(A)=1

    (4)类中有一个int型数据(int占4个字节)

    1 class A {
    2 public:
    3     A(){}
    4     void fun(){}
    5 private:
    6     int a;
    7 };
    8 sizeof(A)=4

    (5)含有静态变量的类大小

    1 class A {
    2 public:
    3     A(){}
    4     void fun(){}
    5 private:
    6     int a;          //保存在栈中
    7     static int b;   //保存全局区,而sizeof()只统计在栈中的内存,所以此时sizeof(A)=4
    8 };
    9 sizeof(A)=4

    (6)类中有一个int型数据和一个虚函数

    1 class A {
    2 public:
    3     A(){}
    4     virtual void fun(){}  //有虚函数那么在类中就会有一个隐藏的对象,该对象是一个指针,会占四个字节
    5 private:
    6     int a;          
    7     static int b;   
    8 };
    9 sizeof(A)=8

    (7)继承

     1 class A {
     2 public:
     3     A(){}
     4     virtual void fun(){}
     5 private:
     6     int a;          //保存在栈中
     7     static int b;   //保存全局区,而sizeof()只统计在栈中的内存,所以此时sizeof(A)=4
     8 };
     9 class B :public A {           //A中的私有变量虽然不可以继承到B中,但是会占位置的
    10     B() {}
    11     ~B() {}
    12     virtual void fun(){}
    13 };
    14 sizeof(B)=8                  //A中的int型变量a(4个字节)+B中的隐藏对象(4个字节)

    第十一章 接口与继承

    1、覆盖

    1 A* pa = new A();  
    2 pa->foo();        
    3 B* pb = (B*)pa;   //此时pa仍然是指向A的类对象,因此pb也指向A的类对象
     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 public:
     7     void virtual foo()
     8     {
     9         cout << "A" << endl;
    10     }
    11 };
    12 class B :public A
    13 {
    14 public:
    15     void virtual foo()    //这里不加virtual也是可以的,只要基类中加派生类同名函数自动成为虚函数
    16     {
    17         cout << "B" << endl;
    18     }
    19 };
    20 int main()
    21 {
    22     A* pa = new A();  //创建指向A类对象的指针pa
    23     pa->foo();        //由于pa是基类指针,所以执行基类A中的函数foo()
    24     B* pb = (B*)pa;   //将pa转换为B类型并创建B类型指针,最后将pa赋值给pb,但是pa仍然指向基类的类对象,所以pb也指向基类的类对象
    25     pb->foo();        //执行基类A中的函数foo()
    26     delete pa, pb;
    27 
    28     pa = new B();    //此时pa指向了派生类的类对象
    29     pa->foo();       //执行派生类中的函数foo()
    30     pb = (B*)pa;
    31     pb->foo();       //执行派生类中的函数foo()
    32 
    33     system("pause");
    34     return 0;
    35 }
    View Code

     2、虚继承

     

     

    第十二章位运算与嵌入式编程

    1、位值转换

     1 #include <stdio.h>   //for printf()
     2 #include <iostream>  //for system()
     3 
     4 int main()
     5 {
     6     printf("%f
    ", 5);
     7     printf("%d
    ", 5.0);
     8 
     9     system("pause");
    10     return 0;
    11 }

    2、int、float等占的字节数

     1 #include <iostream>  //for system()
     2 using namespace std;
     3 int main()
     4 {
     5     cout << "char" << " " << "int" << " " << "float" << " " << "double" << " " << "long" << " " << "short" << "	
    ";
     6     cout << sizeof(char)<<"  " << sizeof(int) << "  " << sizeof(float) << "  " << sizeof(double) << "  " << sizeof(long) << "  " << sizeof(short) << "	
    ";
     7 
     8     system("pause");
     9     return 0;
    10 }

     3、const变量和const指针

    (1)const普通变量

    1 int const size;
    2 const int size;

    这两条语句都是把size声明为一个整数,他的值不能被修改。可以在声明的时候对他进行初始化:

    1 const const size =10

    (2)const指针一:常量指针(此时常量是形容词,指针式名词,中心词是指针)

    1 const int *p;  //定义指向只读变量的指针
    2 int const *p;   //定义指向只读变量的指针

    两者相同,p是一个指向只读变量的指针,可以p的指向,但不能修改*p。如下:

    1 int b = 52 int c = 33 const int *p=&b;
    4 *p=6//错误,不能通过指针修改所指向的值;
    5 p=&c;    //正确,可以修改指针的值  

    (3)const指针二:指针常量(此时指针式形容词,常量是名词,中词词是常量)

    1 int * const p;   //含义是常量指针,p的值不可以修改

    p是一个只读指针,p的指向无法修改,但是可以修改*p。如下:

    1 int b = 52 int c = 33 int *const p = &b;
    4 *p = 6;  //正确,可以修改指针所值向的值
    5 p =&c;   //错误,不可以修改指针的值 

    (4)const指针三

    1 const  int * const p;

    无论是p还是*p都不可以被修改

    简单的判断的方法:

    • 如果const在  *  的左侧,则const用来修饰指针所指向的变量,即指针指向位常量;
    • 如果const位于 * 的右侧,则const就是修饰指针本身,即指针本身就是常量。

    4、处理器字长和编写十六进制的unsigned int型变量时候应该注意的问题

     解析:

    对于十六位机器:

    unsigned int compzero = 0xFFFF; //正确,一个F为4位,4个F即16位,所以对于16位机器来说是合适的

    对于32位机器:

    1 unsigned int compzero = 0xFFFFFFFF; //正确,一个F为4位,8个F即32位,所以对于32位机器来说是合适的

    但unsigned int compzero = ~0;更安全,不管有多少位,直接取反,把所有的0都变成1了

     5、malloc()参数为0出现的情况

    《C语言参考手册》上说“如果请求的长度为0,则标准C语言函数返回一个null指针或不能用于访问对象的非null指针。”或者你也可以直接在linux里man malloc来查阅手册:

     因此下面的输出是不确定的:

    1 char *ptr;
    2 if((ptr = (char *)malloc(0))==NULL)
    3     puts("Got a null pointer");
    4 else
    5     puts("Got a valid pointer");

    if是为了鉴别malloc()返回值是NULL,还是一个唯一的待释放指针,因此输出也不是确定的,尽管我用vs2017多次编译运行,输出都是"Got a valid pointer"。

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     char* p = (char*)malloc(0);
     6     if (p == NULL)
     7         cout << "Got a NULL pointer" << endl;
     8     else
     9         cout << "Got a valid pointer" << endl;
    10 
    11     cout << sizeof((char*)NULL) << endl;  //打印4
    12     //cout << strlen((char*)NULL) << endl;  //会导致运行错误
    13 
    14     system("pause");
    15     return 0;
    16 }
    View Code

     将程序改成:

    1 char *ptr=(char *)malloc(0));
    2 if(int pp = (strlen(ptr) == 0)
    3     puts("Got a null pointer");
    4 else
    5     puts("Got a valid pointer");

    “==”优先级高于"=",所以if语句中其实是一个赋值语句,计入ptr是一个NULL指针,那么strlen(ptr)会导致程序在运行期间崩溃

    再次修改程序:

    1 char *ptr=(char *)malloc(0));
    2 if(int pp = (sizeof(ptr) == 4)
    3     puts("Got a null pointer");
    4 else
    5     puts("Got a valid pointer");

    无论ptr是NULL指针还是待释放的指针,sizeof(ptr) == 4恒成立

  • 相关阅读:
    java指定路径写、读文件
    [转]EP3C16Q240C8N 引脚说明
    [转]CMOS器件空闲管脚的处理
    [转]Altium Designer之多图纸设计
    [转]SDRAM驱动笔记
    [转]VHDL语言中方向字buffer与inout有什么异同
    [转]FPGA的边沿检测
    [转]FPGA中为什么要把NCEO设置为普通的IO口
    [转]SignalTap II使用方法简介
    [转]C-SPY
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/12630554.html
Copyright © 2020-2023  润新知