目录
对象:
访问限定符:
对象实例化:
成员对象的访问:
字符串数组函数:string:
内存分区:
构造函数:
规则和特点:
定义方法:
构造函数初始化:
特性:
拷贝构造函数:
如何定义:
拷贝构造函数存在两种默认:
析构函数:
特性:
对象的生命历程:
总结:
对象是具体的事物,类由对象中抽象出;
类中不一定定义出对象的所有信息;
目的不同,抽象出的信息完全不同;
类是一个模板,根据类的设计实例出多个对象的过程:
左边是栈访问成员对象,右边是堆访问成员对象;
定义一个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