【C++-13】类和对象(上):对象实例化,构造函数,拷贝构造函数,析构函数

it2022-05-05  140

目录

对象:

访问限定符:

对象实例化:

成员对象的访问:

字符串数组函数:string:

内存分区:

构造函数:

规则和特点:

定义方法:

构造函数初始化:

特性:

拷贝构造函数:

如何定义:

拷贝构造函数存在两种默认:

析构函数:

特性:

对象的生命历程:

总结:

​​


类是抽象的概念,对象是具体的事物

对象:

对象是具体的事物,类由对象中抽象出;

类中不一定定义出对象的所有信息;

 目的不同,抽象出的信息完全不同;

访问限定符:

对象实例化:

 

 

类是一个模板,根据类的设计实例出多个对象的过程:

成员对象的访问:

左边是栈访问成员对象,右边是堆访问成员对象; 

字符串数组函数:string:

#include<stdlib.h> #include<iostream> #include<string> using namespace std; //1.提示用户输入姓名并接受 //2.向用户问好; //3.告诉用户名字长度 //4.告诉用户名字首字母 //5.如果用户直接输入回车,告诉用户输入为空 //6.如果用户输入user,告诉用户是一个管理员 int main() { string name; cout << "please input your name :"; getline(cin, name); if(name.empty()) { cout << "input is NULL....." << endl; system("pause"); return 0; } if (name == "user") { cout << "you are a administrator" << endl; } cout << "holle " << name << endl; cout << "your name length:" <<name.size()<< endl; cout << "your name first letter is:"<<name[0] << endl; system("pause"); }

 

定义一个Student类,包含名字一个数据成员,使用get和set函数封装名字这个数据成员。在main函数中通过new实例化对象,并打印其相关函数。

#include <iostream> #include <string> using namespace std; /** * 定义类:Student * 数据成员:m_strName * 数据成员的封装函数:setName()、getName() */ class Student { public: // 定义数据成员封装函数setName() void setName(string str) { m_strName=str; } // 定义数据成员封装函数getName() string getName() { return m_strName; } //定义Student类私有数据成员m_strName private : string m_strName; }; int main() { // 使用new关键字,实例化对象 Student *str = new Student(); // 设置对象的数据成员 str->setName("嘟嘟"); // 使用cout打印对象str的数据成员 cout<<str->getName()<<endl; // 将对象str的内存释放,并将其置空 delete str; str=NULL; return 0; }

 

#include<stdlib.h> #include<iostream> #include<string> using namespace std; class student { public : void setName(string _name) { m_strName = _name; } string getName() { return m_strName; } void setGender(string _gender) { m_strGender = _gender; } string getGender() { return m_strGender; } int getScore() { return m_iScore; } void initScore() { m_iScore = 0; } void study(int _score) { m_iScore += _score; } private: string m_strName; string m_strGender; int m_iScore; }; int main() { student stu; stu.initScore(); stu.setName("mumu"); stu.setGender("女"); stu.study(3); stu.study(4); cout << stu.getName() << " " << stu.getGender() << " " << stu.getScore() << endl; system("pause"); return 0; }

内存分区:

构造函数:

初始化函数被写在构造函数内,在对象实例化时被自动调用;

规则和特点:

构造函数在对象实例化时被自动调用;构造函数与类同名;构造函数没有返回值;构造函数可以有多个重载方式;实例化对象时仅用到一个构造函数;当用户没有定义构造函数时,编译器自动生成一个构造函数;

定义方法:

 

 

构造函数代码演示:

#include<stdlib.h> #include<iostream> #include<string> using namespace std; /*Teacher类 自定义无参构造函数 自定义有参构造函数 数据: 名字 年龄 成员函数: 数据成员的封装 */ class Teacher { public : Teacher(); Teacher(string name, int age=24); void setName(string name); string getName(); void setAge(int age); int getAge(); private: string m_strName; int m_iAge; }; void Teacher::setName(string name) { m_strName = name; } string Teacher::getName() { return m_strName; } void Teacher::setAge(int age) { m_iAge = age; } int Teacher::getAge() { return m_iAge; } Teacher::Teacher() { m_strName = "jim"; m_iAge = 15; cout << "Teacher()" << endl; } Teacher::Teacher(string name,int age) { m_strName = name; m_iAge =age; cout << "Teacher(string name,int age)" << endl; } int main() { Teacher t1; Teacher t2("lulu", 18); Teacher t3("baobao"); cout << t1.getName() << " " << t1.getAge ()<< endl; cout << t2.getName() << " " << t2.getAge ()<< endl; cout << t3.getName() << " " << t3.getAge() << endl; system("pause"); return 0; }

构造函数在对象实例化时被调用;

构造函数没有返回值。

构造函数可以重载。

构造函数与类同名。

构造函数初始化:

'

特性:

代码演示: 

#include<stdlib.h> #include<iostream> #include<string> using namespace std; /*Teacher类 自定义有参默认构造函数 使用初始化列表初始化数据 数据: 名字 年龄 成员函数: 数据成员的封装 拓展: 定义可以带最多学生的个数,此为常量 */ class Teacher { public : //Teacher(); Teacher(string name="dongdong", int age=24,int m=100); void setName(string name); string getName(); void setAge(int age); int getAge(); int getMax(); private: string m_strName; int m_iAge; const int m_iMax; }; void Teacher::setName(string name) { m_strName = name; } string Teacher::getName() { return m_strName; } void Teacher::setAge(int age) { m_iAge = age; } int Teacher::getAge() { return m_iAge; } Teacher::Teacher(string name,int age,int m):m_strName(name),m_iAge(age),m_iMax(m) { cout << "Teacher(string name,int age)" << endl; }int Teacher::getMax() { return m_iMax; } int main() { Teacher t1; Teacher t2("lulu", 18,98); cout << t1.getName() << " " << t1.getAge ()<< endl; cout << t2.getName() << " " << t2.getAge ()<< endl; system("pause"); return 0; }

如果没有自定义的析构函数则系统产生一个析构函数。

堆中对象销毁时,析构函数被自动调用。

栈中对象销毁时,会自动调用析构函数。

析构函数没有参数,也没有返回值。

拷贝构造函数:

如何定义:

拷贝构造函数存在两种默认:

(1)没有自定义拷贝构造函数,则系统自动生成一个默认的拷贝构造函数;

(2)当采用直接初始化或复制初始化实例化对象时,系统自动调用拷贝构造函数。

代码演示:

#include<stdlib.h> #include<iostream> #include<string> using namespace std; /*Teacher类 自定义拷贝构造函数 数据: 名字 年龄 成员函数: 数据成员的封装 */ class Teacher { public : Teacher(string name="dongdong", int age=16); Teacher(const Teacher&tea); void setName(string name); string getName(); void setAge(int age); int getAge(); private: string m_strName; int m_iAge; }; Teacher::Teacher(string name, int age):m_strName(name), m_iAge(age) { cout << "Teacher(string name,int age)" << endl; } Teacher::Teacher(const Teacher&tea) { cout << "Teacher(const Teacher&tea)" << endl; } void Teacher::setName(string name) { m_strName = name; } string Teacher::getName() { return m_strName; } void Teacher::setAge(int age) { m_iAge = age; } int Teacher::getAge() { return m_iAge; } int main() { Teacher t1; Teacher t2 = t1; Teacher t3(t1); system("pause"); return 0; }

拷贝构造函数参数是确定的,不可以重载。

当没有自定义的拷贝构造函数时,系统自动生成一个拷贝构造函数。

通过同类型的对象实例化另外的对象时,自动调用拷贝构造函数。

拷贝构造函数没有返回值。

析构函数:

特性:

第一点与构造函数和拷贝构造函数一样,

第二点构造函数是在实例化时被调用,

第三点,构造函数和拷贝构造函数一样都没有返回值,但可以有参数,可重载。

对象的生命历程:

代码演示: 

#include<stdlib.h> #include<iostream> #include<string> using namespace std; /*Teacher类 1,自定义析构函数 2,普通方式实例化对象,在销毁对象时是否自动调用析构函数 3,通过拷贝构造函数实例化对象,在销毁对象时是否自动调用析构函数 数据: 名字 年龄 成员函数: 数据成员的封装 */ class Teacher { public : Teacher(string name="dongdong", int age=16); Teacher(const Teacher&tea); ~Teacher(); void setName(string name); string getName(); void setAge(int age); int getAge(); private: string m_strName; int m_iAge; }; Teacher::Teacher(string name, int age):m_strName(name), m_iAge(age) { cout << "Teacher(string name,int age)" << endl; } Teacher::Teacher(const Teacher&tea) { cout << "Teacher(const Teacher&tea)" << endl; } Teacher::~Teacher() { cout << "~Teacher()" << endl; } void Teacher::setName(string name) { m_strName = name; } string Teacher::getName() { return m_strName; } void Teacher::setAge(int age) { m_iAge = age; } int Teacher::getAge() { return m_iAge; } int main() { { Teacher t1; Teacher *p = new Teacher(); delete p; Teacher t2(t1); } system("pause"); return 0; }

 

定义一个Student类,包含名字一个数据成员,定义无参构造函数、有参构造函数、拷贝构造函数、析构函数及对于名字的封装函数,在main函数中实例化Student对象,并访问相关函数,观察运行结果。

#include <iostream> #include <string> using namespace std; /** * 定义类:Student * 数据成员:m_strName * 无参构造函数:Student() * 有参构造函数:Student(string _name) * 拷贝构造函数:Student(const Student& stu) * 析构函数:~Student() * 数据成员函数:setName(string _name)、getName() */ class student { public : //无参构造函数: student() { m_strName=""; } //有参构造函数 student(string _name) { m_strName=_name; } //拷贝构造函数 student(const student& stu ) { } //析构函数 ~student() { } void setName(string); string getName(); private: string m_strName; }; void student::setName(string _name) { m_strName =_name; } string student::getName() { return m_strName; } int main(void) { // 通过new方式实例化对象*stu student *stu = new student; // 更改对象的数据成员 stu->setName("春和景明"); // 打印对象的数据成员 cout<<stu->getName()<<endl; delete stu; stu=NULL; return 0; }

总结:

类包含:成员函数、数据成员。若担心与其他的类同名,可以在类之上声明命名空间

栈的空间是有限的,对于比较大的结构体,类,建议使用new,放在堆中,还有对于创建不确定大小的数组等,使用堆实例化可以动态分配内存空间;

慕课网:C++远征之封装篇(上):  https://www.imooc.com/learn/382

 


最新回复(0)