++运算符的对象必须是左值,而(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));
}
重载overload & 覆盖(重写)override&隐藏hide
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
维数组必须指定列的数量,行的数量可以不指定
malloc不能直接申请物理内存,它申请的是虚拟内存
(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
class
A
{
int
i;
union
U
{
char
buff[13];
int
i;
}u;
void
foo() { }
typedef
char
* (*f)(
void
*);
enum
{red, green, blue} color;
}a;
|
sizeof(a)的值是(24)
- int i占4个字节
- union U实例化为u占取16个字节(char数组占13个字节,但因为最大类型为int,所以占取只能为4字节的整数倍即最小16字节,这里是需要对齐的,如果是char buff[3],int i,则只占用四个四节)
- 空函数不占取字节
- typedef只是声明,不占取字节
- 枚举类型占取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
#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
这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
int
main(){
int
i=-2147483648;
return
printf
(
"%d,%d,%d,%d"
,~i,-i,1-i,-1-i);
}
2147483647,-2147483648,-2147483647,2147483647