概念 | 比喻 |
---|---|
对象/实例 | 楼房 |
实例化 | 建造 |
类 | 建筑图纸 |
特征 | 说明 | 类比 |
---|---|---|
抽象 | 抽出具体事物的普遍性的本质 | 分门别类:鸟类、哺乳类、鱼类 |
封装 | 把数据与处理(函数)包在一起 | 通信录(增加、删除) |
继承 | 数据与处理(函数)的传承 | 财富与绝技、混血儿(肤色/头发、 两种语言 |
多态 | 同一个事物(函数)的多种形态 | 手机键盘数字与字母、 电脑键盘功能键 |
class 类名{
成员变量成员函数声明
};
class定义最后的;一定不要忘记。
构成 | 作用 |
---|---|
数据成员(data member)/成员变量/属性 | 对象内部数据和状态,只能在类定义中声明,可以在成员函数中直接调用。 |
成员函数/方法 | 对象相关的操作,可以在类内实现或类外实现。 |
#include
using namespace std;
class Complex{
private: // 成员变量一般是私有的,只能通过成员函数访问
int real;
int imag;
public: // 成员函数一般是公有的,可以提供给对象对外调用
void Init(int r, int i){
real = r;
imag = i;
}
void Init(int r){
Init(r,0); // 调用上面的Init函数
}
int GetReal(){
return real;
}
int GetImag(){
return imag;
}
void SetReal(int r){
real = r;
}
void SetImag(int i){
imag = i;
}
void Print(){
if(0!=real)
cout << real;
if(0!=real && 0<imag){
cout << "+";
}
if(0!=imag)
cout << imag << "i";
cout << endl;
}
Complex Plus(Complex c){
Complex res;
res.real = real + c.real;
res.imag = imag + c.imag;
return res;
}
Complex Divide(Complex c){
Complex res;
res.real = real - c.real;
res.imag = imag - c.imag;
return res;
}
Complex Multiple(Complex c){
Complex res;
res.real = real*c.real - imag*c.imag;
res.imag = real*c.imag + imag*c.real;
return res;
}
};
int main(){
Complex c;
c.Init(1,2);
c.Print();
Complex c2;
c2.Init(0,3);
c2.Print();
Complex c3;
c3.Init(1);
c3.Print();
Complex c4;
c4.Init(-1,-1);
c4.Print();
Complex sum = c3.Plus(c2);
sum.Print();
Complex Divide = c3.Divide(c2);
Divide.Print();
Complex Multiple = c3.Divide(c4);
Multiple.Print();
}
限定符 | 作用 |
---|---|
private[默认] | 私有 |
public | 公开 |
protected | 保护 |
实践中,成员变量多数情况使用private或者protected,成员函数多数情况使用public。通常,通过成员函数改变对象的成员变量。
#include
using namespace std;
struct Student{
char name[20];
bool sex;
int age;
};
int main(){
struct Student s = {
"John",false,30}; //在C语言中此处struct关键字不可以省略,在C++中可以。
cout << s.name << endl;
cout << s.sex << endl;
cout << s.age << endl;
}
#include
using namespace std;
class Student{
public:
// 成员变量
char name[20];
bool sex;
int age;
// 成员函数
void Print();
};
void Student::Print(){
cout << "name:" << name << endl;
cout << "age:" << age << endl;
cout << "sex:" << sex << endl;
}
int main(){
Student s = {
"John",false,30};
cout << s.name << endl;
cout << s.sex << endl;
cout << s.age << endl;
// 调用成员函数
s.Print();
}
#include
using std::cout;
using std::endl;
struct SPos {
int x,y,z;
};
class CPos {
int x,y,z;
};
int main(){
#ifdef STRUCT
SPos spos = {
1,1,1};
cout << "(" << spos.x << "," << spos.y << "," << spos.z << ")" << endl;
#else
CPos cpos = {
1,1,1};
cout << "(" << cpos.x << "," << cpos.y << "," << cpos.z << ")" << endl;
#endif
}
C++class与struct区别是:
注意:
C++的struct可以有成员函数,而C不可以。
C++的struct可以使用访问控制关键字(public private protected),而C不可以。
SPos spos; // C++
struct SPos spos; // C/C++
成员变量默认初始化为随机值(主要影响指针)。
基本类型
int main(){
int a = 10;
int b(10);
cout << a << " " << b << endl;
}
基本类型的初始化新增语法:
int a(0);// 等价 int a = 0;
const float b(1.0);// 等价 const float b = 1.0;
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo d; // 变量(命名对象)
Demo(); // 匿名对象
}
基本类型
int* p = new int;
delete p;
p = NULL;
类类型
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo* d = new Demo;
delete d;
d = NULL;
}
基本语法
类名* 对象指针 = new 类名;// 调用默认构造函数
delete 对象指针;
对象指针new可以为对象设置初始值,例如下面代码
int* p = new int(100);
cout << *p << endl;
基本类型
int* pa = new int[10];
delete pa;// 只释放p[0],数组的第一个元素
delete [] pa;// 释放全部数组
类类型
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo* d = new Demo[10];
delete [] d;
d = NULL;
}
对象数组指针new不可以为对象设置初始值
int* pa = new int[10](100); // error: array 'new' cannot have initialization arguments
注意:C++除了特殊情况,很少直接使用malloc()/free()申请释放内存,取而代之的是new/delete。
空结构体与空类的大小(sizeof)为1,主要在于初始化/实例化时,编译器给变量/对象分配内存(地址),内存最小单位为1个字节。
通常,sizeof(类型) == sizeof(变量)。
如果成员函数形参与成员变量同名,使用this->做为前缀区分。