1.类的引入:
c语言结构体中只能定义变量,在c++中,结构体不仅可以定义变量,还可以定义函数。
已c++的方式完成以前用c语言写的栈,会大有不同。
typedef int DateType;
struct stack
{
void Init(int capacity)
{
_array = (DateType*)malloc(sizeof(DateType)*capacity);
if(array == NULL)
{
perror("malloc fail");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(DataType& data)
{
_array[_size] = data;
++_size;
}
DateType Top()
{
return _array[_size - 1];
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
DateType* _array;
int _size;
int _capacity;
}
但其实在c++里面,上面代码中的struct更常用class来代替。
2.类的定义:
--->定义方式如下:
class className
{
//类体:由成员变量和成员函数组成
};
//人的信息
class person
{
public:
void information()
{
cout<<_name<<"_"<<_sex<<"_"<<_age<<endl;
}
public:
char* _name;
char* _sex;
int _age;
};
(2)声明放在.h函数里面,成员函数定义放在.cpp文件里面,注意:成员函数名前需要加类名。
//.h文件
class person
{
public:
void information();
public:
char* _name;
char* _sex;
itn _age;
}
//.cpp文件
void person::informatiion()
{
cout<<_name<<"_"<<_sex<<"_"<<_age<<endl;
}
3.类的访问限定符和封装:
(1)访问限定符:
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
访问限定符有public(公有),protected(保护),private(私有)。
(2)封装:
面向对象的三大特征:封装,继承,多态。
4.类的作用域:
类定义了一个新的作用域,类的所有成员都在类的作用域里面。在类体外面定义成员时,需要使用::作用域操作符指明成员属于哪个类域。
class Person
{
public:
void information();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定information是属于Person这个类域
void Person::informatiion()
{
cout << _name << " "<< _gender << " " << _age << endl;
5.类的实例化:
用类创建对象的过程,称为类的实例化:
6.类对象模型:
(1)如何计算类对象的大小:
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
char _a;
};
(2)复习结构体内存对齐规则:
7.this指针:
this指针的引出:
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int —month;
int _day;
}
int main()
{
Date d1,d2;
d1.Init(2022,1,11);
d2.Init(2022, 1, 12);
}
有这样的一个问题,类的函数是放在公共区域,那么d1和d2调用Init是怎么区分的呢?
this指针的特性:
this指针是否可以为空:
(1)可以为空的情况:
当调用的成员函数内部不通过this指针访问对象中的成员变量或者成员函数的时候,即使传递一个空的this指针,程序也可以正常运行:
class A
{
public:
void print()
{
cout<<"print()"<<endl;
}
private;
int _a;
};
int main()
{
A* p = nullptr;
p->print();
return 0;
}
此时,print函数没有访问成员对象,p为nullptr的时候,调用print函数也可以正常运行。
(2)不能为空的情况:
若成员函数需要通过this指针去访问对象的成员变量或者调用其他成员函数,this指针为空就会导致程序崩溃。
class A
{
public:
void print()
{
cout<<_a<<endl;
}
private:
int _a;
}
int main()
{
A* p = nullptr;
p->print();
return 0;
}
上述两种情况中p都作为实参传递给this指针。