您的位置:首页 > 编程语言 > C语言/C++

C++之内联函数+类内/外定义+构造函数+初始化列表+析构函数

2017-03-03 11:11 330 查看
内联函数

关键字是inline,如下应用:

inline void fun()
{
cout << "hello " << endl;
}


内联函数与普通函数的区别如下:(相当于内联函数省去了步骤2和4)



类内定义:将函数的函数体定义在类内。

类内定义与内联函数的关系:类内定义就是默认为inline内联函数。

类外定义

类外定义就是函数体在类外面,分为同文件类外定义和分文件类外定义。

在数据结构中,内存的分区如下所示:



栈区由系统管理,分配和回收不需要程序员关心。

在申明一个类后,不会占用存储。只有在实例化一个对象时,才会在堆或栈中占据空间。若没有对实例化的数据初始化,是非常危险的。所以要对其初始化。为了防止漏初始化和重复初始化,C++设置了构造函数。构造函数的最大特点就是在对象实例化时自动调用,被调用且仅调用一次,构造函数与类名是相同的,构造函数没有返回值,可以重载,当用户没有定义构造函数时,系统自动生成一个构造函数。

无参构造函数:

class Student()
{
public:
**Student()**{ m_strName = "jim"; }
private:
string m_strName;

}


有参构造函数:

class Student()
{
public:
**Student(string name)**{ m_strName = name; }
private:
string m_strName;

}


重载构造函数:

class Student()
{
public:
**Student()**{ m_strName = "Jim"; }
**Student(string name)**{ m_strName = name; }//重载的构造函数

private:
string m_strName;
}


初始化列表,如下面代码:

class Student()
{
public:
Student() :m_strName("Jim"), m_iAge(10){}//初始化列表

private:
string m_strName;
int m_iAge;
}


初始化列表有几个特性:

1。初始化列表先于构造函数执行

2。初始化列表只能用于构造函数

3。初始化列表可以同时初始化多个数据成员

初始化列表的必要性:

//初始化列表的必要性
class Circle
{
public:
Circle(){m_dPi=3.14}//错误,编译器提示是const类型,不能再复赋值
private:
const double m_dPi;
};

class Circle
{
public:
Circle():m_dPi=3.14{ }//若初试化的话正确
private:
const double m_dPi;
};


下面我们来看一段代码:

class Student
{
public:
Student()
{
cout << "Student" << endl;
}
private:
string m_strName;
};

int main()
{
Student stu1;
Student stu2 = stu1;
Student stu3(stu1);

return 0;
}


在main()函数初始化中,将stu1的复制给了stu2和stu3,理论上应该是初始化了三次,那么应该输出三行“student”,但实际运行后我们发现,只输出一行“student”。这两种实例化方式时调用的是拷贝构造函数,而不是代码中的构造函数:

定义格式:类名(const 类名& 变量名)

class Student
{
public:
Student(){ m_strName = "Jim"; }
**Student(const Student& stu){}**
private:
string m_strName;
};


在没有定义拷贝构造函数时,系统会自动生成一个拷贝构造函数并调用,这也是为什么上面代码只输出了一个“student”。

析构函数:

析构函数在对象销毁时自动调用,归还系统资源。

格式为:~类名()。

class Student
{
public:
Student(){ cout << "Student" << endl; }
~Student(){ cout << "~Student" << endl; }
private:
string m_strName;
};


析构函数的特性:

1.如果没有自定义的析构函数则系统自动生成

2.析构函数在对象销毁时自动调用

3.析构函数没有返回值,没有参数也不能重载

下面一段代码展示了析构函数的重要性。析构函数可以释放掉堆中的内存。

class Student
{
public:
Student(){ m_pName = new char[20]; }//堆中申请了资源
private:
char *m_pName;
};

class Student
{
public:
Student(){ m_pName = new char[20]; }//堆中申请了资源
~Student(){delete []m_pName;}//释放内存
private:
char *m_pName;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 封装