目录
第六章
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
第十二章位运算与嵌入式编程
1、位值转换
1 #include <stdio.h> //for printf()
2 #include <iostream> //for system()
3
4 int main()
5 {
6 printf("%f\n", 5);
7 printf("%d\n", 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" << "\t\n";
6 cout << sizeof(char)<<" " << sizeof(int) << " " << sizeof(float) << " " << sizeof(double) << " " << sizeof(long) << " " << sizeof(short) << "\t\n";
7
8 system("pause");
9 return 0;
10 }
(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 = 5;
2 int c = 3;
3 const int *p=&b;
4 *p=6; //错误,不能通过指针修改所指向的值;
5 p=&c; //正确,可以修改指针的值
(3)const指针二:指针常量(此时指针式形容词,常量是名词,中词词是常量)
1 int * const p; //含义是常量指针,p的值不可以修改
p是一个只读指针,p的指向无法修改,但是可以修改*p。如下:
1 int b = 5;
2 int c = 3;
3 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了
《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恒成立