浅谈C++类与对象 知识
2021/6/30 22:21:21
本文主要是介绍浅谈C++类与对象 知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
浅谈C++类和对象
一、内联函数
1.在类内部写函数体 (隐式)
2.写关键字inline (显式)
二、构造、析构函数
对象的创建与初始化、对象生命期结束时的清理工作,分别由构造函数和析构函数完成。
(一)构造
构造函数的功能、特点
1.在定义对象时由系统自动调用来创建对象并初始化对象。
2.构造函数通常是对成员变量进行初始化
3.构造函数的函数名与类名相同。
构造函数初始化成员有两种方法
A.使用构造函数的函数体进行初始化
B.使用构造函数的初始化列表进行初始化
初始化列表形式:
funname(参数列表):初始化列表
{ 函数体,可以是空函数体 }
初始化列表的形式:
成员名1(形参名1),成员名2(形参名2),成员名n(形参名n)
class Date { int d, m, y; public: Date(int dd, int mm, int yy):d(dd),m(mm),y(yy) { } Date(int dd, int mm): d(dd),m(mm) { } }
★必须使用参数初始化列表对数据成员进行初始化的几种情况
数据成员为常量
数据成员为引用类型
数据成员为没有无参构造函数的类的对象(有参构造函数的对象)
//数据成员为常量、数据成员为引用类型 #include <iostream> using namespace std; class A{ public: A(int i):x(i),rx(x),pi(3.14) {} void display() {cout<<"x="<<x<<"rx="<<rx<<"pi="<<pi<<endl;} private: int x,℞ const float pi; }; int main(){ A aa(10); aa.display(); return 0; } //数据成员为没有无参构造函数的类的对象 #include <iostream> using namespace std; class ABC{ public: ABC (int x, int y, int z) {a=x;b=y;c=z;} private: int a,b,c; }; class MyClass{ public: MyClass():abc(1,2,3) {} private: ABC abc; }; int main(){ MyClass myclass; return 0;}
★类成员的初始化的顺序
按照数据成员在类中的声明顺序进行初始化,与初始化成员列表中出现的顺序无关
构造函数的重载
带默认值的构造函数表示多种情况
(二)析构
析构函数自动调用(隐式调用),没有返回值,不能有参数,也不能重载(一个类中只能有一个析构函数)!
构造、析构调用顺序
先造后析
三、复制构造
1.形式:
复制构造函数有且仅有一个参数,即是同类对象的引用。
class 类名 { public: 类名(参数表); //构造函数 类名([const] 类名 &对象名); //复制构造函数 ... //[ ]表示非必填 }; 类名::类名([const] 类名 &对象名) { 函数语句 }
2.调用
以下三种情况下由编译系统自动调用:
●声明语句中用类的一个已知对象初始化该类的另一个对象时。
●当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。
●当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将临时对象的值初始化另一个对象,需要调用复制构造函数。(此时,也将调用析构销毁临时对象)
#include <iostream> using namespace std; class Box{ public: Box(int =10, int =10, int =10); Box(const Box & b) {height=2*b.height; width=2*b.width; length=2*b.length;} int volume(); private: int length, height, width; }; Box::Box(int h, int w, int l):length(l),width(w),height(h) {} int Box::volume () { return width*height*length;} int main(){ Box box1(1,2,3),box2(box1),box3=box2; //调用形式:对象(对象)或对象=对象 cout<<"Box1's volume is "<<box1.volume()<<endl; cout<<"Box2's volume is "<<box2.volume()<<endl; cout<<"Box3's volume is "<<box3.volume()<<endl; return 0; }
3.深浅复制
3.1 浅复制
默认复制构造函数所进行的是简单数据复制,用一个对象初始化另一个对象时,两个对象同时指向了同一资源(只复制数据,内存共用)的复制方式称为浅复制。
当类的数据成员含有指针类型时,浅复制构造函数存在问题。
3.2 深复制
一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源。深复制构造函数必须显式定义!
当成员变量中含有指针变量时,需要定义深复制构造函数!
深复制构造函数的特点
定义:类名::类名([const] 类名 &对象名);
成员变量的处理:对指针类型的成员变量,使用new操作符进行空间的申请,然后进行相关的复制操作
Person::Person(const Person& P0) //复制构造函数的实现 { name=new char[strlen(P0.name)+1]; strcpy(name,P0.name); age=P0.age; salary=P0.salary; }
四、静态成员
同一个类不同对象数据成员的共享。包括:
●静态数据成员
static int total;
对于静态数据成员,每个类只拥有一个副本。
静态数据成员初始化:
类型 类名::静态数据成员=初始化值;
●静态成员函数
static void display();
静态成员函数属于整个类(不是某一个对象的成员)可以直接访问该类的静态数据成员,而不能直接访问非静态数据成员。
静态成员函数如要访问非静态成员,需要通过对象名才能访问该对象的非静态数据成员.
调用时,可以通过两种方式进行:
Person::display(); //通过类名调用静态成员函数 s4.display(); //通过对象调用静态成员函数
五、友元
在类的外部直接访问类的私有数据成员,进行数据共享。
类外的非本类成员函数需要访问类的私有数据成员或保护成员,则需要将该函数声明为类的友元函数。友元函数不是类的成员函数!
友元函数声明格式:friend 返回值类型 函数名(参数表);
友元类的声明格式:friend class 类名; (在友元类中定义要访问的类的对象,以实现对类私有成员的访问)
六、常类型
解决数据共享与数据安全的统一
指使用关键字const说明,值在程序运行期间是不可改变的。
(一) 常引用
const 类型说明符 &引用名;
(二)常对象
类名 const 对象名; const 类名 对象名;
如果一个对象被说明为常对象,则通过该对象只能调用它的常成员函数。
(三)常对象成员
包括:
1.常成员函数
类型 函数名(参数表) const;
●const是函数类型的一个组成部分,因此在函数的实现部分也要使用关键字const。
●常成员函数不能修改对象的数据成员,也不能调用该类中没有由关键字const修饰的成员函数,从而保证了在常成员函数中不会修改数据成员的值。
●const可参与区分函数重载。
●如果一个对象被说明为常对象,则通过该对象只能调用它的常成员函数。
2.常数据成员
类中说明的常数据成员,构造函数只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值。
class A { public: A(int i); void print(); const int &r; private: const int a,b; static const int c; }; const int A::c=10; //静态常数据成员在类外说明和初始化 A::A(int i):a(i),b(i),r(a) //常数据成员只能通过初始化列表来获得初值 { } void A::print() { cout<<a<<":"<<b<<":"<<c<<":"<<r<<endl; } void main() { A a1(220),a2(80),a3(100); a1.print(); a2.print(); a3.print(); }
这篇关于浅谈C++类与对象 知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享
- 2024-06-28忘记eyoucms后台密码怎么办?-icode9专业技术文章分享
- 2024-06-26终极指南:Scrum中如何设置需求优先级
- 2024-06-26AI大模型企业应用实战(25)-为Langchain Agent添加记忆功能
- 2024-06-26小白家庭 nas 搭建方案-icode9专业技术文章分享
- 2024-06-23AI大模型企业应用实战(14)-langchain的Embedding