我是靠谱客的博主 会撒娇白开水,最近开发中收集的这篇文章主要介绍【C++-13】类和对象(上):对象实例化,构造函数,拷贝构造函数,析构函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

对象:

访问限定符:

对象实例化:

成员对象的访问:

字符串数组函数: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;
	
}

内存分区:

构造函数:

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

规则和特点:

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

定义方法:

 

 

构造函数代码演示:

#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】类和对象(上):对象实例化,构造函数,拷贝构造函数,析构函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部