龙岗网站制作新闻,陇南地网站建设,深圳建设工程交易信息网,网站建设 事业单位 安全面向对象和面向过程编程初步认识 C语言是面向过程的#xff0c;关注过程#xff08;分析求解问题的步骤#xff09; 例如#xff1a;外卖#xff0c;关注点菜#xff0c;接单#xff0c;送单等 C是面向对象的#xff0c;关注对象#xff0c;把一件事拆分成不同的对象关注过程分析求解问题的步骤 例如外卖关注点菜接单送单等 C是面向对象的关注对象把一件事拆分成不同的对象对每个对象进行分别管理依靠对象之间的交互完成。例如外卖关注用户骑手商家三个核心对象三者交互完成这件事 文章目录 类的引入访问限定符类域类的大小sizeofthis指针构造函数析构函数拷贝构造 类的引入
在C语言中有结构体struct的概念C是兼容了struct在C语言中的用法同时增加了结构体中实现函数功能为了区别结构体C引入了新的关键字class——类 类中的内容是类的成员变量叫做成员变量或类的属性函数叫做成员函数或类的方法 C中类和结构体基本上的用法是相同的 注意 变量的定义是指开空间类中的成员变量都是声明对象实例化时才是定义
class Date {int _year;int _month;int _day;
};这是一个简单的日期类 也可以写作
struct Date2 {int _year;int _month;int _day;
};上述代码访问d1._year 报错了d2._year却没有 这就要说到访问限定符了
访问限定符
C有三种访问限定符publicprivateprotected 就是限制对类中的成员进行访问 public公有类里面和外面都可以使用 private私有只有类里面可以使用 protected 先不考虑 class 和 struct 的主要的区别就在这里 class 不加访问限定符就默认表示私有 struct 默认表示公有 这就是为什么上述代码报错加上public限定符修饰就可以在外面访问成员变量了 加上这样的修饰就可以访问了
public这样就是修饰为公有范围到下一个访问限定符或者结尾。 一般情况下成员变量都是私有的不希望直接访问或修改成员变量而是通过函数调用来修改
类域
我们想要对类中的函数进行声明定义分离该如何操作呢 看下面代码
class Date {public:void print();int _year;int _month;int _day;
};void print()
{_year 1, _month 1, _day 1;cout _year - _month - _day endl;
}int main()
{Date d1;d1.print();return 0;
}上述打印功能函数会直接报错这里就要了解类域
类定义了一个新的作用域类的所有成员都在类的作用域中类外定义成员时需要使用 :: 操作 正确代码应该是 void Date::print()
{_year 1, _month 1, _day 1;cout _year - _month - _day endl;
}这样就可以了
类的大小sizeof
类中成员函数的功能都是一样的所以类里面只存成员变量成员函数存在一个公共的区域代码段每个对象里面都放成员函数太冗余了每创建一个类都为函数开辟空间太浪费 没有成员变量的类大小为 1byte为了表示这个对象存在过。
遵循结构体内存对齐规则空间换时间提高效率
this指针
上述打印日期时我们没有传入参数但是能打印出结果
class Date {public://构造函数初始化先不用管Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}void print(){cout this-_year - _month - _day endl;}int _year;int _month;int _day;
};int main()
{Date d1(2005, 8, 27);Date d2(2004, 8, 27);d1.print();d2.print();return 0;
}运行结果如下 可以通过this指针来找到d1中的成员变量this指针编译时编译器会自动不上不写也可以但注意的时this在函数中可以使用不能传参。this指针相当于 d1this指针是形参对d1的拷贝存在于栈区 面向对象的三大特性封装继承多态 封装的本质是一种管控把数据和方法都放在类里面通过访问限定符对成员变量进行限制也更便于维护 先来看封装
构造函数 Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}上述代码中这个函数可以对日期类成员变量进行初始化。 这就是一个构造函数主要任务是初始化对象。 构造函数有以下几个特性 1、函数名与类名相同 2、无返回值 3、对象实例化时自动调用不需要自己操作 4、构造函数可以重载 5、如果没有写构造函数构造函数可以自动生成一个构造函数但是它不做任何事情 6、编译器自动生成的构造函数内置类型不做任何处理自定义类型去调用它的构造函数
无参数全缺省自动生成的都是默认构造函数一般建议提供全缺省构造函数 绝大多数情况下要自己写构造函数只要写了一个编译器就不会默认生成了一般构造函数写成全缺省的最方便
析构函数
析构函数清理资源 类名 1、没有返回值没有参数 2、函数结束自动执行析构函数清理资源 3、析构函数也可以默认生成功能和构造函数类似。 析构函数只有一个不能被重载
拷贝构造
拷贝构造函数 传参要传引用否则会无穷递归传参本身就会产生形参形参又要调用拷贝构造函数从而形成无限递归 拷贝构造是默认成员函数如果没有显示定义会默认生成拷贝构造函数 内值类型浅拷贝值拷贝 自定义类型调用拷贝构造函数 成员变量中有数组指针就需要进行深拷贝 默认生成的拷贝构造不能实现深拷贝