.h头文件
#ifndef TEACHER_H
#define TEACHER_H
class teacher
{
public:
int age;
public:
void setage(int age);
int getage();
};
#endif // TEACHER_H
下方是对应的cpp文件。将方法分开写的。与Java不一样。本质可以写一起的分开好管理。
#include "teacher.h"
void teacher::setage(int a)
{
age=a;
}
int teacher::getage()
{
return age;
}
#include <iostream>
#include "teacher.h"
using namespace std;
int main()
{
teacher t;
t.setage(10);
cout << t.getage() << endl;
return 0;
}
正常调用。导入头文件即可。
#include <iostream>
using namespace std;
class teache
{
public:
teache()//构造函数,类的初始化时加载。无参时才会调用
{
cout<<"我是构造函数"<<endl;
}
teache(int a){
age=a;
}
teache(const teache &obj){//当然此函数可以不用写,在调用时需要执行的操作。深拷贝需重写。
cout<<"我是拷贝函数"<<endl;
}
int getage(){
return age;
}
~teache()//析构函数,类的对象销毁时调用,相当于delete方法
{
cout<<"我是析构函数"<<endl;
}
private:
int age;
};
int main()
{
teache t1(10);//带参构造的三种方法
teache t2=(10,20);
teache ta=t2;//当执行这条语句时,实则将t2拷贝给ta。调用拷贝函数。
teache t3=teache(12);
cout<<t3.getage()<<endl;
system("pause");
teache tw;
}
1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数
2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数
3) 当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数
4 )默认拷贝构造函数成员变量简单赋值
总结:只要你写了构造函数,那么你必须用。
使用类似于 teache a=("xxxx");teache b=a;实际是在teache进入栈内存,在堆内存分配出空间给字符串,b浅拷贝了a。两个指向同一个堆内存,弱析构函数存在回收对象的方法,实则调用两次析构方法,但堆内存只有一个数据会报错。解决方案,书写深拷贝构造函数,格式为teache (const char *t),将带参构造函数再写一遍,在堆内存空间写两个字符串。
#include <iostream>
using namespace std;
class A
{
public :
A(int a_){
a=a_;
cout<<"A的构造构"<<endl;
}
~A(){
cout<<"A的析构"<<a<<endl;
}
public :
int a;
};
class B
{
public :
B(int b_):a1(1),a2(2),c(0){//固定写死的1,2
}
B(int b_,int m,int n):a1(m),a2(n),c(0)//灵活调用
{
b=b_;
cout<<"B的构造构"<<endl;
}
~B(){
cout<<"B的析构"<<b<<endl;
}
public :
int b;
A a1;//内部类初始化
A a2;
const int a;//必须进行初始化
};
int main(){
//A a(10);
//A a2(20);
//B b(1);
B b1(1,2,3);
}
构造函数与析构函数的调用顺序
1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同;之后调用自身类的构造函数
2)析构函数的调用顺序与对应的构造函数调用顺序相反