第九章 Struct和其他复合类型
学习要点
- 结构体(struct)的声明与定义
结构体声明后并不直接分配内存,只是说明该结构体有哪些成员类型组成。当程序定义该结构体类型的变量时才分配存储空间。
#include<iostream>
using namespace std;
struct point{//结构体的定义
int a;
int b;
char c;
char d;
};
void print(point &p){//使用引用传参提高效率
cout<<p.a<<p.b<<endl;
p.a=0;
}
int main(){
point p1,p2;
p1.a = 10;
p1.b =20;
p1.c = 'a';
p2 = p1;
cout<<p2.a<<"------"<<p2.b<<"------"<<p2.c<<endl;
//内存数为结构体中成员所占的内存空间的总和,不足则补齐到四的倍数
cout<<"内存测试"<<sizeof(p2)<<endl;
print(p2);
cout<<p2.a<<endl;
}
- 在函数传参过程中,形参使用引用传递时,效率更高,不过会共享变量。
- 共用体(union)的声明与定义
公用体其作用是对于不同的数据类型使用共同的存储地址。公用体在程序运行时只有一个成员是出于活动状态。 - 共用体的初始化及使用
能够访问的是共用体最后一次被赋值的成员,在对一个新成员赋值后原有的成员就失去了作用。
#include<iostream>
using namespace std;
union Data{
char c;
int i;
double d;
};
int main(){
Data d;
d.c = 'u';
d.i=15;
d.d = 2.33;
//共用体中每次只有一个数据是有效的,由最后一次的初始化决定
cout<<"数据测试"<<d.i<<endl;
cout<<"数据测试"<<d.d<<endl;
}
结构体和共用体的差异
结构体是数据类型的组合,所占用的内存控件等于各个成员占据的总和。共用体是不同数据类型的共用存储空间,所占据的内存空间等于最大成员占用的空间大小。枚举(enum)的定义和声明
枚举元素作为常量,C++编译时按定义顺序对他们进行赋值为0,1,2,…。也可以在声明枚举类型时另行指定枚举元素的值。
#include<iostream>
using namespace std;
enum city{//Guangzhou的值为6,在5后面开始增加
Shanghai,Beijing,Nanjing,Tianjin=5,Guangzhou
};
void ff(enum city c){
switch(c){
case 0:
cout<<"Shanghai"<<endl;
break;
case 1:
cout<<"Beijing"<<endl;
break;
case 2:
cout<<"Nanjing"<<endl;
break;
case 5:
cout<<"Tianjin"<<endl;
break;
case 6:
cout<<"Guangzhou"<<endl;
break;
default:
cout<<"查无此城"<<endl;
break;
}
}
int main(){
enum city c1,c2,c3,c4;
int i=7;
c1 = (enum city)i;
c2 = Nanjing;
c3 = (enum city)5;
ff(c1);
ff(c2);
ff(c3);
}
疑难解惑
C和C++中的结构体有什么差别
C++中的结构体可以含有成员函数C++中共用体有什么特点
1.共用体的目的是希望同一个内存断存放几种不同类型的数据,但同一时间段只能有一个。
2.能够访问的只有最后一次赋值的成员
3.共用体变量的地址和其他各成员的地址都是同一地址
4.不能对共用体变量名赋值,不能企图引用变量名来得到一个值,不能在定义变量时进行初始化,不能用共用体变量名作为函数参数。
第十章 类
学习要点
类的概念及定义
类可以看成广义的数据类型,类包含数据和对数据进行操作的函数。
类中的成员函数可以在类外实现,也可以在类内直接实现。类和对象。类是抽象,不占内存,对象是具体,占用内存。
- 嵌套类,(java中的内部类)隐藏底层实现的作用。
- const使用及注意点
1.const变量不能修改数据,const指针不能改变指向。
2.const修饰函数参数,函数中不能改变这个参数
3.const修饰成员函数,不能调用非const成员函数。const成员函数不能更改数据
#include<iostream>
using namespace std;
int main(){
//const测试
int a = 5;
int a2 = 10;
//普通常量变量不能改变
const int b =10;
//b++;
//指定a为常类型,变量可以改变指向,但不可以更改a中的数据
const int * ca = &a;
ca = &a2;
//(*ca)++;数据不能更改,否则报错
//cout<<*ca<<endl;
//常指针,不能更改指向,可以更改数据
int * const ca2 = &a2;
(*ca2)++;
cout<<a2<<endl;
//ca2 = &a;不能更改指向
int const * const a6 = &a1; ///const data,const pointer
const int * const a7 = &a1; ///const data,const pointer
}
- 类的访问权限,私有,保护,公有
静态成员
1.静态成员目的是为了实现数据共享,类的静态变量属于类,而非对象,一个类的所有对象共用同一个类的静态变量。
2.静态成员的初始化在类外进行。静态成员函数,类似静态成员,使用静态成员函数不需要对象。
- 友元函数
友元关系具有单向性,不具有交换性和传递性。友元函数并不能看作类的普通成员函数,故在实现时不用加类名限制。
#include<iostream>
#include<cstring>
using namespace std;
class Internet{
public :
Internet(char *name,char * address){
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet &obj);
protected:
char name[20];
char address[20];
};
void ShowN(Internet &obj){
cout<<obj.name<<endl;
}
int main(){
Internet a("新浪","www.sina.com");
ShowN(a);
}
疑难解惑
- C++中,const成员和const对象的区别
1.const数据成员和const常量一样。
2.const成员函数可以读取数据成员的值,但是不能修改,如果需要修改则可以在数据成员添加mutable修锁。
3.const对象仅能调用const成员函数。