QT–c++基础下
1.类函数的重载特性
1.1类函数的重载特性
类函数的重载特性就是说我们可以在类里面定义同名的函数,但是里面的参数要不一样。
#include "widget.h"
#include <QApplication>
#include<iostream>
using namespace std;
class student
{
public:
char name[64];
int age;
void test();
void test(int c);//类的重载,同名的函数,但是参数不一样
private:
int haha;
};
void student::test()
{
haha = 100;
cout<<haha<<endl;
}
int main(int argc, char *argv[])
{
student my;
student *my1 = new student;
my.age = 18;
my1->age =21;
my.test();
cout<<my.age<<endl;
cout<<my1->age<<endl;
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
重载函数在调用的时候,会根据参数的类型,然后去匹配相应的函数进行调用
#include "widget.h"
#include <QApplication>
#include<iostream>
using namespace std;
class student
{
public:
char name[64];
int age;
void test();
void test(int c);//类的重载,同名的函数,但是参数不一样
private:
int haha;
};
void student::test()
{
haha = 100;
cout<<haha<<endl;
}
void student::test(int c)//重载
{
cout<<c<<endl;
}
int main(int argc, char *argv[])
{
student my;
student *my1 = new student;
my.age = 18;
my1->age =21;
my.test();
my.test(5);
cout<<my.age<<endl;
cout<<my1->age<<endl;
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
2.构造函数和析构函数
2.1析构函数
定义:假如 我们定义了析构函数, 当对象被删除或者生命周期结束的时候,就会触发析构函数
2.2构造函数
定义:假如我们定义了构造函数,就会触发这个构造函数。
2.3如何定义析构函数和构造函数?
1.析构函数和构造函数的名字必须和类名一样
#include "widget.h" #include <QApplication> #include<iostream> using namespace std; class student { public: student();//构造函数名必须和类名一模一样 char name[64]; int age; void test(); void test(int c);//类的重载,同名的函数,但是参数不一样 private: int haha; }; student::student()//构造函数 { cout<<"hello"<<endl; } void student::test() { haha = 100; cout<<haha<<endl; } void student::test(int c)//重载 { cout<<c<<endl; } int main(int argc, char *argv[]) { student my;//构造函数是在对象被创建的时候被触发 student *my1 = new student;//因为这里创建了两个对象,所以会被触发两次,触发student函数两次 my.age = 18; my1->age =21; my.test(); my.test(5); cout<<my.age<<endl; cout<<my1->age<<endl; QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
这是是因为new创建的对象是存储在堆上的,堆不会再函数结束后自动释放,所以需要delete来手动释放堆上的空间
2.析构函数要在前面加上一个~
#include "widget.h" #include <QApplication> #include<iostream> using namespace std; class student { public: student();//构造函数名必须和类名一模一样 ~student();//析构函数前面要加一个~ char name[64]; int age; void test(); void test(int c);//类的重载,同名的函数,但是参数不一样 private: int haha; }; student::student()//构造函数 { cout<<"hello"<<endl; } student::~student()//析构函数 { cout<<"buy"<<endl; } void student::test() { haha = 100; cout<<haha<<endl; } void student::test(int c)//重载 { cout<<c<<endl; } int main(int argc, char *argv[]) { student my;//构造函数是在对象被创建的时候被触发 student *my1 = new student;//因为这里创建了两个对象,所以会被触发两次,触发student函数两次 my.age = 18; my1->age =21; my.test(); my.test(5); cout<<my.age<<endl; cout<<my1->age<<endl; QApplication a(argc, argv); Widget w; w.show(); delete my1;// 当对象被删除或者生命周期结束的时候,就会触发析构函数, //会触发两次,因为delete删除一个对象my1,和程序结束 return 0; return a.exec(); }
3.构造函数可以被重载
#include "widget.h" #include <QApplication> #include<iostream> using namespace std; class student { public: student();//构造函数名必须和类名一模一样 student(int a);//构造函数可以进行重载 ~student();//析构函数前面要加一个~ char name[64]; int age; void test(); void test(int c);//类的重载,同名的函数,但是参数不一样 private: int haha; }; student::student()//构造函数 { cout<<"hello"<<endl; } student::student(int a)//构造函数的重载 { cout<<a<<endl; } student::~student()//析构函数 { cout<<"buy"<<endl; } void student::test() { haha = 100; cout<<haha<<endl; } void student::test(int c)//重载 { cout<<c<<endl; } int main(int argc, char *argv[]) { student my;//构造函数是在对象被创建的时候被触发 //student *my1 = new student;//因为这里创建了两个对象,所以会被触发两次,触发student函数两次 //打印两次hello //如果要使用构造函数的重载 student *my1 = new student(10); //这个时候就打印一次hello和一次10 my.age = 18; my1->age =21; my.test(); my.test(5); cout<<my.age<<endl; cout<<my1->age<<endl; QApplication a(argc, argv); Widget w; w.show(); delete my1;// 当对象被删除或者生命周期结束的时候,就会触发析构函数, //会触发两次,因为delete删除一个对象my1,和程序结束 return 0; return a.exec(); }
4.析构函数不能被重载
3.类的继承
3.1什么是类的继承
类的继承允许我们在新的类里面继承父类的public还有protected部分,private是不能被继承的。
当我们觉得这个类不好的时候,可以使用类的继承,添加我们需要的功能
格式:
class 儿子::public 爸爸{ public: ..... protected: }3
3.2如何在子类里面去访问父类的成员
也是通过->去访问的
#include "widget.h" #include <QApplication> #include<iostream> using namespace std; class student { public: student();//构造函数名必须和类名一模一样 student(int a);//构造函数可以进行重载 ~student();//析构函数前面要加一个~ char name[64]; int age; void test(); void test(int c);//类的重载,同名的函数,但是参数不一样 private: int haha; }; class mystudent:public student//类的继承 { public: int gread; }; student::student()//构造函数 { cout<<"hello"<<endl; } student::student(int a)//构造函数的重载 { cout<<a<<endl; } student::~student()//析构函数 { cout<<"buy"<<endl; } void student::test() { haha = 100; cout<<haha<<endl; } void student::test(int c)//重载 { cout<<c<<endl; } int main(int argc, char *argv[]) { student my;//构造函数是在对象被创建的时候被触发 //student *my1 = new student;//因为这里创建了两个对象,所以会被触发两次,触发student函数两次 //打印两次hello //如果要使用构造函数的重载 student *my1 = new student(10); //这个时候就打印一次hello和一次10 mystudent my2;//类的继承 my2.gread = 99; my2.age = 11;//子类可以访问父类的成员 // my2.haha = 100;这是不能被访问的,因为haha是私有的 cout<<my2.gread<<endl; cout<<my2.age<<endl; my.age = 18; my1->age =21; my.test(); my.test(5); cout<<my.age<<endl; cout<<my1->age<<endl; QApplication a(argc, argv); Widget w; w.show(); delete my1;// 当对象被删除或者生命周期结束的时候,就会触发析构函数, //会触发两次,因为delete删除一个对象my1,和程序结束 return 0; return a.exec(); } //调用了三次析构函数my my1 my2 //有多少对象就构造多少,同样也析构多少
4.虚函数和纯虚函数
4.1定义:
虚函数:有实际定义的,允许派生类对它进行覆盖式的替换,virtual来修饰
纯虚函数:没有实际定义的函数就是纯虚函数
virtual void test();//虚函数 virtual void testa(){}//纯虚函数,花括号里面什么也没有
4.2怎么定义一个虚函数?
用virtual来修饰,虚函数是用在类的继承上的
4.3虚函数的优点
可以预留接口,实现分工合作