最近在搞python,qt有一段时间没碰了,有些语法顿时感觉陌生,甚至有些看不懂了,像一些构造函数和析构函数,本次特地来了解构造函数和析构函数,在c++中可以从参数来分,可以分为有参构造和无参构造,根据类型来分,可以分为普通构造和拷贝构造,我们来看一段代码,如下所示
#include<stdio.h>
#include<iostream>
using namespace std;
class Person
{
public:
//构造函数(默认构造)
Person()
{
age = 10;
}
//有参构造函数
Person(int age,string name)
{
this->age = age;
this->name = name;
}
//拷贝构造函数
Person(const Person &p)
{
this->age = p.age+20;
this->name = p.name;
}
int age;
string name;
};
int main()
{
Person *p = new Person();
Person *p1 = new Person(25,"刘");
cout<<p->age<<endl;
cout<<p1->age<<p1->name<<endl;
Person *p2 = new Person(*p1);
cout<<p2->age<<p2->name;
}
这里我们实现了3个构造函数。这里注意下拷贝构造函数是用const修饰用了&引用,由于要拷贝数据,被拷贝的对象要求值不能变,因此使用const可以说过去,而为什么使用引用的方式呢?常量引用与传值和传引用的方式相比,优点在于既不会对原对象产生副作用,又可以避免对象的无谓复制,因为常量引用只是把它所绑定的对象的地址传递给了拷贝构造函数,而不是对整个对象进行拷贝。这样不仅减少产生额外的开销,而且还减少占用更多的内存空间。除此之外,构造函数可以另一种方法实现(类外),如下代码
#include<iostream>
#include<stdio.h>
using namespace std;
class Person
{
public:
Person();
static int a;
void show()
{
cout<<"666";
}
};
//构造函数
Person::Person()
{
}
int Person::a = 10;
int main()
{
cout<<Person::a;
Person *p1 = new Person();
p1->show();
return 0;
}
这里注意下::,这个代表作用域,表示在Person类作用域下的Person构造函数,这个很好理解。同时类中有个静态成员变量a,注意,静态变量只能在类中声明,在类外实现(在类内部声明静态成员变量主要是用来告诉编译器这个成员变量是一个静态成员,但是并没有真正地为它分配内存空间和初始化,这个工作需要在类外完成。同时,如果我们在头文件中定义了静态成员变量并且在多个编译单元中包含了这个头文件,那么我们就会有多个对同一个静态成员变量的定义,这将导致链接错误和重复定义问题。因此,在类外进行初始化可以避免这些问题),非静态变量没有要求。因此上面的show函数也可以在类外实现,类外实现的代码如下
#include<iostream>
#include<stdio.h>
using namespace std;
class Person
{
public:
Person();
static int a;
void show();
};
//构造函数
Person::Person()
{
}
void Person::show()
{
cout<<"666"<<endl;
}
int Person::a = 10;
int main()
{
cout<<Person::a;
Person *p1 = new Person();
p1->show();
return 0;
}
注意下,只有静态变量才可以用类直接访问哈,非静态变量只能通过实例化对象来访问。这里a为静态变量,可以直接通过Person类访问,而show为非静态成员函数,必须通过实例化对象实现访问。注意的是在类外实现时,类型必须和类内声明的类型一致!!!
点击此处登录后即可评论