发布时间:2024-12-12 08:01
目录
一,类定义
二,类的访问限定符及封装
三,类的作用域
四,类的实例化
五,类对象大小
六,this指针
C语言关注的是过程,分析求解问题的步骤,通过函数调用逐步解决问题;
C++关注的是对象,将一件事拆分成不同对象,靠对象间交换完成;
一,类定义
C中,结构体中只能定义变量,但C++中,结构体内不仅可以定义变量,还可定义函数;在C++中,更喜欢用类(class)来替代;
//struct内可定义变量和函数
struct S
{
void fun()
{
cout << "class" << endl;
}
char _name[20];
int _age[3];
};
int main()
{
S s;
s.fun();
return 0;
}
类是 C++ 的核心特性,用于指定对象的形式(即描述对象),通常被称为用户定义的类型;定义一个类,本质上是定义一个数据类型的蓝图;
类定义:
类定义的两种方式:
注:
//类声明和定义全部放在类体中
//编译器可能会将成员函数当成内联函数处理
class Person
{
//访问修饰符:private/public/protected
public:
//方法或成员函数
void showInfo()
{
cout << _name << "/" << _sex << "/" << _age << endl;
}
//访问修饰符:private/public/protected
public:
//成员变量
char* _name;
char* _sex;
int _age;
}; //封号结束
//.h 声明
class Person
{
public:
void showInfo();
public:
char* _name;
char* _sex;
int _age;
};
//.cpp 定义
void Person::showInfo()
{
cout << _name << "/" << _sex << "/" << _age << endl;
}
二,类的访问限定符及封装
C++实现封装的方式,用类将对象的属性与方法结合在一起,通过访问权限选择性的将其接口提供给外部的用户使用;
访问限定符
注:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别;
C++中struct和class的区别:
封装
面向对象三大特征:封装、继承、多态、抽象、反射(java)等;
封装:将数据和方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互;封装本质是管理,
三,类的作用域
//声明
class Person
{
public:
void showInfo();
public:
char _name[20];
char _sex[3];
int _age;
};
//类外定义
void Person::showInfo()
{
cout << _name << "/" << _sex << "/" << _age << endl;
}
四,类的实例化
用类类型创建对象的过程,即称为类的实例化;
//类的实例化
Person man;
Person woman;
五,类对象大小
类大小
类对象的存储方式
注:结构体内存对齐规则
六,this指针
this指针的特性
//定义一个类
class Date
{
public:
void Display()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
void SetDate(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
Display();
}
private:
int _year;
int _month;
int _day;
};
//实际成员函数
void Display(Date* this)
{
cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
}
void SetDate(Date* this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
this->Display();
}
//此程序可正常运行
//因为成员函数地址存于公共代码段
//调用函数时不会去访问p指向的空间,不存在空指针的解引用
//只会把p传递给隐形的this指针,且show函数内也没有解引用this指针
class A
{
public:
void show()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->show();
return 0;
}