概述
目录
对象:
访问限定符:
对象实例化:
成员对象的访问:
字符串数组函数: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
最后
以上就是会撒娇白开水为你收集整理的【C++-13】类和对象(上):对象实例化,构造函数,拷贝构造函数,析构函数的全部内容,希望文章能够帮你解决【C++-13】类和对象(上):对象实例化,构造函数,拷贝构造函数,析构函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复