类内、外定义&构造函数&析构函数

1.类内定义与内联函数

内联函数
(1)类内定义时,定义的函数会默认为内联函数(inline);(优先编译为内联函数)
(2)类外定义
分为同文件类外定义和分文件类外定义。
要写::这个符号(同文件类外定义)
写: 头文件#include“ ” (分文件类外定义)

(3)ex:
要求:定义一个teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,数据成员有:名字,年龄,性别;成员函数为:数据成员的封装函数授课teach。

#include<iostream>
#include<stdlib.h>
using namespace std;

class Teacher
{
public:
   void setName(string _name);
   string getName();
   void setGender(string _gender);
   string getGender;
   void setAge(int _age);
   int getAge();
   void teach();
private:
   string m_strName;
   string m_strGender;
   int m_iAge;
};
//类外定义
void Teach::setName(string _name)
{
   m_strName = _name;
}
string Teach::getName()
{
   return m_strName;
}
void Teach::setGender(string _gender)
{
   m_strGender = _gender;
}
string Teach::getGender()
{
   return m_strGender;
}
void Teach::set//以此类推
/*
.
.
.
*/
int main(void)
{
   Teach t;
   t.setName("孔子");

   system("pause");
   return 0;
}

分文件类外定义:在头文件下建立一个.h文件,在源文件下建立一个.cpp文件。

2. 内存分区

(1)栈区(内存由系统控制)
int x = 0; int *p = NULL;
(2)堆区(new分配的内存将分配到堆区,需要程序员自己释放)
int *p = new int[20];
(3)全局区
存储全局变量和静态变量
(4)常量区
string str = “hello”;
(5)代码区
存储逻辑代码的二进制

3.对象初始化

(1)有且仅有一次
为了避免误操作:比如忘记调用初始化函数,或者多次调用初始化函数
这里引入了——>构造函数

(2)根据条件进行初始化

===================================

4.构造函数

构造函数在对象实例化时被自动调用(被调用仅被调用一次)
构造函数与类同名
构造函数无返回值
构造函数有多个重载形式
实例化对象时仅用到一个构造函数
当用书没有定义构造函数时,编译器自动生成一个构造函数。

(1)无参构造函数
(2)有参数构造函数(参数带默认值,参数无默认值)
(3)重载构造函数

(1.1)默认构造函数(属于无参构造函数)
Techer(string name = “jim”,int age =15);

初始化列表
正常初始化:

Teacher::Teacher(string name,int age)
{
m_strName = name;
m_iAge = age;
}

初始化列表初始化:

Teacher::Teacher(string name,int age):m_strName(name),m_iAge(age);
{
cout << "刷个存在感"<<endl;
}

(4)拷贝构造函数
定义格式:
类名(const 类名&变量名)

如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数
当采用直接初始化或复制初始化实力对象时系统自动调用拷贝构造函数

(5)系统自动生成的函数

普通构造函数、拷贝构造函数

5. 析构函数

对象销毁时调用

定义格式 ~类名()

不允许加任何参数

没有返回值,没有参数也不能重载

6.对象的生命历程

申请内存——初始化列表——构造函数——参与运算——析构函数——释放内存

=================================
ex:

#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 = " ";
         cout << "Student()" <<endl;
     }
     Student(string _name)
     {
         m_strName = _name;
         cout << "Student(string _name)" <<endl;
     }
     Student(const Student& stu)
     {
         cout << "Student(const Student&stu) " <<endl;
     }
     ~Student()
     {
         cout <<  "~Student()"<<endl;
     }
     void setName(string _name)
     {
         m_strName = _name;
     }
     string getName()
     {
         return m_strName;
     }
private:
     string m_strName;
};

int main(void)
{
    Student stu1;  //调用无参构造函数
    Student stu2("sy");  //调用有参构造函数
    Student stu3(stu2);   //调用拷贝构造函数
    // 通过new方式实例化对象*stu
    Student *stu = new Student;
    // 更改对象的数据成员为“慕课网”
    stu->setName("慕课网");
    // 打印对象的数据成员
    cout << stu->getName()<<endl;
    delete stu;
    stu = NULL;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值