牛客网刷题知识点汇总

++运算符的对象必须是左值,而(x+y),(a-b--)这样的表达式是右值(arthmetic expressions are rvalues),常量9也是右值(rvalues),所以不满足条件。

类的大小只与成员变量(非static数据成员变量)和虚函数指针有关,和普通成员函数无关,如果有多个虚函数,也只算一个虚函数指针,如果整个类为空类,算一个字节。

 

下面代码会输出什么:

int main(int argc,char**argv){
    int a[4]={1,2,3,4};
    int*ptr=(int*)(&a+1);
    printf(“%d”,*(ptr-1));
}
指针的实质为:地址+步长。指针的类型决定了步长。
定义了数组a[4],其中a,&a,&a[0]都是数组的起始地址。但是步长有区别,也就是指向的类型不同
a等同于a+0等同于&a[0],是指向数组第一个元素的指针,步长为指向的元素所占用的地址空间为sizeof(int) 。
&a也是指向数组第一个元素的指针,但其意义是指向整个数组的首地址,指向的类型为整个数组,所以其步长为4*sizeof(int)

 

重载overload & 覆盖(重写)override&隐藏hide

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)


维数组必须指定列的数量,行的数量可以不指定
 
free释放的内存不一定直接还给操作系统,可能要到进程结束才释放。
malloc不能直接申请物理内存,它申请的是虚拟内存
 
const只对它左边的东西起作用 ,  唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用。 
 
deque支持随机访问。
 

(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型并初始为1.0f,但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,你非要按int型来解释不可)。
1.0f   在内存中的存储为
0   011   1111   1   000   0000   0000   0000   0000   0000.
把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216

(int&)a 相当于*(int*)&a ,*(int*)(&a),*((int*)&a)  
(int)a   a在内存中的值转换成int类型   
 
在32位机器上,下列代码中
class
 
      int i; 
      union
      
          char buff[13]; 
          int i; 
      }u; 
      void foo() {    } 
      typedef char* (*f)(void*); 
      enum{red, green, blue} color; 
 }a; 

sizeof(a)的值是(24)

  1. int i占4个字节
  2. union U实例化为u占取16个字节(char数组占13个字节,但因为最大类型为int,所以占取只能为4字节的整数倍即最小16字节,这里是需要对齐的,如果是char buff[3],int i,则只占用四个四节)
  3. 空函数不占取字节
  4. typedef只是声明,不占取字节
  5. 枚举类型占取4个字节,枚举内部是用int实现的

总共占取4+16+4=24个字节

 

class Test{
public:
    int a;
    int b;
    virtual void fun() {}
    Test(int temp1 = 0, int temp2 = 0)
    {
        a=temp1 ;
        b=temp2 ;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
};
 
int main()
{
    Test obj(5, 10);
    // Changing a and b
    int* pInt = (int*)&obj;
    *(pInt+0) = 100;  
    *(pInt+1) = 200;  
    cout << "a = " << obj.getA() << endl;
    cout << "b = " << obj.getB() << endl;
    return 0;
} a=200,b=10
需要考虑虚函数表,指向虚函数表的指针在32位系统下占用4个字节,其地址分布在整个类成员变量的地址的首部,接下来就是变量a的地址、b的地址。当将test对象obj赋给指向整型的pInt后,指针pInt指向了地址的首部也就是虚函数表指针,所以*(pInt+0)=100改变的是虚函数表的值,接下来*(pInt+1)=200改变的是变量a的值,变量b没有变换。
 
#include <iostream> 
using namespace std; 
int main(void
    const int a = 10
    int * p = (int *)(&a); 
    *p = 20
    cout<<"a = "<<a<<", *p = "<<*p<<endl; 
    return 0
a = 20, *p = 10
因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.

这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。

因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。
 
在debug时,有assert断言保护,而在release时,没有assert断言
 
int main(){
   int i=-2147483648;
   return printf("%d,%d,%d,%d",~i,-i,1-i,-1-i);
}2147483647,-2147483648,-2147483647,2147483647
首先,求 ~i , i的补码为1000 0000  0000  0000  0000  0000  0000  0000,取反0111 1111 1111 1111 1111 1111 1111 1111,此为补码,符号位为0,表示正数,正数原码补码一致,因而该数即表示231-1,即2147483647 。
然后,求 -i ,要对一个数值执行单目运算符 -  表示的是对该数取反然后再+1,也即是我们常说的求补运算,注意这里取反+1与原码求补码的区别!也就是求补运算与求补码是不一样的!例子(4位有符号整数):x=-4  1100(补码)   -x=~x+1 也即是 0011+0001=0100(4),而1100再求补码应是先数值位取反,即1011,然后+1,变成1100!注意这两者(求补与求补码)之间的区别。
题目中  i的补码为 1000 0000  0000  0000  0000  0000  0000  0000,取反+1,仍为 1000 0000  0000  0000  0000  0000  0000  0000,即    -2147483648
求 1-i  我们已经求出-i的补码为1000 0000  0000  0000  0000  0000  0000  0000 加上1的补码即为 1000 0000  0000  0000  0000  0000 0000  0001
该补码表示的原码为1 111 1111  1111 1111 1111 1111 1111 1111,即为- 2147483647
最后求-1-i  -1的补码为1 111 1111  1111 1111 1111 1111 1111 1111,加上-i补码 1000 0000  0000  0000  0000  0000  0000  0000,
得 0111 1111  1111 1111 1111 1111 1111 1111,即 2147483647
另外补充一点,计算机中有符号数和无符号数的机器码(补码)是一样的,同一个二进制码按照有无符号输出结果不一样,例如本题中四个答案如果按照无符号整数输出,那么答案就是2147483647,2147483648,2147483649,2147483647
posted @ 2017-02-18 16:06  Tsunami_lj  阅读(1360)  评论(0编辑  收藏  举报