【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

来源:互联网 发布:单机游戏下载软件 编辑:程序博客网 时间:2024/05/22 14:59

类型转换函数与构造转换函数

#include<iostream>class  fushu{public:explicit  fushu(int num)//避免隐式转换,引发歧义{x = num;y = num;}void print(){std::cout << x << "+" << y << "i" << std::endl;}operator int();//不支持友元,仅仅支持成员函数 operator double(){ return (double)(x + y);}protected:private:int x;int y;};fushu::operator int()//类类之间的转换函数{return x *y;}//转换有赋值,()构造void main3(){int num(100.9);fushu fushu1(num);//构造函数fushu1.print();int data = (int)fushu1 + 10;//类型转换可以把一个自定义类型当作基本数据类型来计算std::cout << data << std::endl;std::cin.get();}void main2(){int num ( 100.9);fushu fushu1(num);//构造函数fushu1.print();//int data (fushu1);//转换//int data = fushu1;//int data = (int)fushu1;//int data = int (fushu1);//int data ( int(fushu1));//std::cout << data << std::endl;std::cin.get();}void main1(){ int num (10.8);//基本数据类型 //隐式转换与显式转换,是否带有类型转换符//fushu fushu1 = (fushu)10.8;//fushu fushu1 = static_cast<fushu>(10.8);fushu fushu1 =(fushu)10;//构造函数//int  numA = fushu1;fushu1.print();std::cin.get();}

类与类之间的转换

#include <iostream>class mianji{public:friend class fushu;mianji(){this->cx = 0;this->cy = 0;}void setxy(int a,int b){this->cx = a;this->cy = b;}protected:private:int cx;int cy;};class fushu{public:friend class mianji;//友元可以访问私有变量fushu(mianji mianji1){this->x = mianji1.cx;this->y = mianji1.cy;}void print(){std::cout << x << "+" << y << "i" << std::endl;}operator mianji(){mianji temp;temp.cx = x;temp.cy = y;return  temp;}protected:private:int x;int y;};void main(){mianji  mianji1;//fushu fushu1 =(fushu) mianji1;fushu fushu1(mianji1);//构造函数//= static_cast<fushu>(mianji1);//构造函数进行转换mianji  mianji2;mianji2.setxy(10, 20);fushu1 = mianji2;fushu1.print();std::cin.get();}

类的继承

类与类之间三种关系:包含,调用,继承。

#include "mainwindow.h"#include <QApplication>#include<stdlib.h>//第一种关系,某一个类作为某一个类的部件class mywindow{public:     MainWindow w;};class show{public:    void showwindow(MainWindow & w )//部分的使用一个类,调用一个类    {        w.show();    }};class newwindow:public MainWindow{public:    void run(char *str)    {        system(str);    }};int main(int argc, char *argv[]){    QApplication a(argc, argv);    newwindow  new1;    new1.show();    new1.run("calc");    return a.exec();}int mainA(int argc, char *argv[]){    QApplication a(argc, argv);mywindow my1;     // my1.w.show();      show show1;      show1.showwindow(my1.w);    return a.exec();}

#pragma once#include<iostream>class coder{private:char *str;public:coder();~coder();void girlfriend();void coding();protected://不允许外部访问,允许子类内部访问int num;};#include "coder.h"coder::coder(){std::cout << "coder create" << std::endl;str = "锄禾日当午";num = 100;}coder::~coder(){std::cout << "coder delete" << std::endl;}void  coder::girlfriend(){std::cout << "一般都会写代码,可以创建一个对象,可是没有对象" << std::endl;}void  coder::coding(){std::cout << "加班加点熬夜" << std::endl;}#pragma once#include "coder.h"//父类的私有成员,不行//父类的保护成员,公有成员内部可以访问//保护成员,公有成员都会变成保护成员class ccoder:protected coder{public:ccoder();~ccoder();};#include "ccoder.h"ccoder::ccoder(){}ccoder::~ccoder(){}#pragma once#include "coder.h"//父类的私有成员,不行//父类的保护成员,公有成员都可以//公有继承,不影响保护成员,公有成员属性变化class cppcoder :public coder{public:cppcoder();~cppcoder();void coding();void ui();};#include "cppcoder.h"cppcoder::cppcoder(){std::cout << "cpp coder create" << std::endl;}cppcoder::~cppcoder(){std::cout << "  cpp  coder delete" << std::endl;}void  cppcoder::ui(){std::cout << "QT真蛋疼" << std::endl;//子类的内部可以访问std::cout << (this->coder::num) << std::endl;}void  cppcoder::coding(){std::cout << "CPP真蛋疼" << std::endl;}#pragma once#include "coder.h"//父类的私有成员,不行//父类的保护成员,公有成员内部可以访问//私有继承,公有成员,保护成员都变成私有成员class javacoder :private coder{public:javacoder();~javacoder();};#include "javacoder.h"javacoder::javacoder(){this->num = 100;}javacoder::~javacoder(){}//main.cpp#include<iostream>#include "coder.h"#include "cppcoder.h"#include "javacoder.h"void main(){javacoder *pjava = new javacoder;//pjava->num = 100;}void  main3(){cppcoder *ptansheng = new cppcoder;coder *pcode = new coder;//protected不允许外部访问,允许子类内部访问ptansheng->ui();std::cin.get();}void  main2(){coder *pcode = new cppcoder;//父类的指针,接受子类指针的地址pcode->coding();cppcoder *pcppcoder = reinterpret_cast<cppcoder *>(pcode);pcppcoder->coding();std::cout << typeid(pcode).name() << std::endl;std::cout << typeid(pcppcoder).name() << std::endl;std::cin.get();}void main1(){cppcoder *ptansheng = new cppcoder;ptansheng->girlfriend();ptansheng->ui();//子类与父类重名,覆盖父类ptansheng->coding();//每一个子类都会生成一个默认的父类对象//调用父类的同名方法ptansheng->coder::coding();    //父类的私有无法使用delete ptansheng;std::cin.get();}

类的继承以及区别

#include<iostream>class father{public:int num;void print(){std::cout << num << std::endl;}father(){num = 99;}};class son:public father{public:int num;void print(){std::cout << num << std::endl;}son()  //子类覆盖父类{num = 89;}};void main(){son *pson = new son;pson->print();pson->father::print();father *p = reinterpret_cast<father *>( pson);p->print();std::cin.get();}

继承静态成员与静态函数

#include<iostream>class myclass{public:int data;static int num;//声明静态变量存在myclass(){num++;//共享,统计对象的数目}static void print(){//this->data;//静态函数无法使用this指针//data = 10;std::cout << num << std::endl;}};int myclass::num = 0;//静态变量初始化//private私有继承,无法传承到下一代class ziclass:protected myclass{void run(){this->print();this->num;}};class sunclass :protected  ziclass{void goandrun(){this->ziclass::myclass::print();}};void main(){ziclass *p = new ziclass;ziclass z1;sunclass *ps = new sunclass;//int a;//p->num;//p->print();p->myclass::num;p->myclass::print();//ps->print();//ps->ziclass::myclass::print();std::cin.get();}

继承实现代码重用

基类的初始化

#include<iostream>class myclass{public:myclass() :x(0){//x = 0;std::cout << "myclass  init without num" << std::endl;}myclass(int num) :x(num){//x = num;std::cout << "myclass init with num" << std::endl;}protected:private:int x;};class myziclass:public myclass{public:myziclass(){std::cout << "myziclass  init without num" << std::endl;    }myziclass(int num) :myclass(num), x(num + 1), y(num+2){std::cout << "myziclass  init with num" << std::endl;}int x;int y;};void main(){//指定构造函数myziclass  *p = new myziclass(10);std::cin.get();}

立方体

#include <iostream>#include<math.h>class dian{public:friend class xian;dian(int a, int b, int c) :x(a), y(b), z(c){          }void print(){std::cout << "x=" << x << ",y=" << y << ",z=" << z << std::endl;}private:int x;int y;int z;};//继承没有意义,包含class xian {public:xian(dian dianx, dian diany) :dian1(dianx), dian2(diany){}double getlength(){double length = 0;length = sqrt((dian1.x - dian2.x)*(dian1.x - dian2.x) + (dian1.y - dian2.y)*(dian1.y - dian2.y) + (dian1.z - dian2.z)*(dian1.z - dian2.z));return length;}dian dian1;dian dian2;protected:private:};class yuan :public xian{public:yuan(dian dianx, dian diany) :xian(dianx,diany){}double getmianji(){return 3.1415926* (this->getlength())*(this->getlength());}double zhouchang(){return 3.1415926* 2*(this->getlength());}};class qiu :public yuan{public:qiu(dian dian1,dian dian2) :yuan(dian1,dian2){}double getmianji(){return 3.1415926* (this->getlength())*(this->getlength()) * 4;}double gettiji(){return 4 / 3.0*3.1415926* (this->getlength())* (this->getlength())* (this->getlength());}};void main(){dian dian1(0, 0, 1);dian dian2(0, 0, 6);dian1.print();dian2.print();xian xian1(dian1, dian2);std::cout << xian1.getlength() << std::endl;yuan yuan1(dian1, dian2);std::cout << yuan1.getmianji() << std::endl;std::cout << yuan1.zhouchang() << std::endl;qiu qiu1(dian1, dian2);std::cout << qiu1.gettiji() << std::endl;std::cout << qiu1.getmianji() << std::endl;std::cin.get();}

单继承QT案例

#include <QApplication>#include<QLabel>#include<stdlib.h>class mylable:public QLabel{public:    mylable( char *str):QLabel(str)    {    }    void run (char *str)    {        system(str);    }};int main(int argc, char *argv[]){    QApplication a(argc, argv);   // QLabel *plabel =new QLabel("ABCDEF");   // plabel->show();    mylable my1("12345ABC");    my1.show();    my1.run("notepad");    return a.exec();}

多继承简介以及实战

#include "mainwindow.h"#include <QApplication>#include<QPushButton>#include<QLabel>class zajiao :public MainWindow,public QLabel,public QPushButton{public:    zajiao(char *str):QLabel(str),QPushButton(str)    {       this->MainWindow::setWindowTitle(str);    }    ~zajiao()    {    }};int main(int argc, char *argv[]){    QApplication a(argc, argv);     zajiao  zajiao1("ABCDEF12345");     zajiao1.QPushButton::show();     zajiao1.QPushButton::move(0,0);     zajiao1.QLabel::show();     zajiao1.MainWindow::show();    return a.exec();}int mainA(int argc, char *argv[]){    QApplication a(argc, argv);    //MainWindow w;    //w.show();   // w.setWindowTitle("ABCD");   // QPushButton *p1=new QPushButton("ABC");  //  p1->show();    return a.exec();}
#include<iostream>#include<stdlib.h>class A{};class B{};class myclass1{public:void run(char *str){system(str);}myclass1(){std::cout << "myclass1 is create" << std::endl;}~myclass1(){std::cout << "myclass1 is delete" << std::endl;}};class myclass2{public:int add(int a, int b){return a + b;}myclass2(){std::cout << "myclass2 is create" << std::endl;}~myclass2(){std::cout << "myclass2 is delete" << std::endl;}};class myclass:public myclass1,public myclass2,public A,public B{public:void print(char *str){std::cout << str << std::endl;}myclass(){std::cout << "myclass is create" << std::endl;}~myclass(){std::cout << "myclass is delete" << std::endl;}};void main2(){myclass *pmy1 = new myclass;delete pmy1;std::cin.get();}void main1(){myclass my1;my1.run("tasklist");my1.myclass1::run("ipconfig");std::cout << my1.add(10, 20) << std::endl;std::cout << my1.myclass2::add(19,20) << std::endl;my1.print("12345");std::cin.get();}

虚基类

虚基类的作用     

    当一个基类被声明为虚基类后,即使它成为了多继承链路上的公共基类,最后的派生类中也只有它的一个备份。

#include <iostream>class obj{public:int num;obj(int data) :num(data){std::cout << "obj  create\n";}obj(){num = 0;std::cout << "obj  create\n";}~obj(){std::cout << "obj  delete\n";}};class  Aobj : virtual  public obj{public:Aobj(int data) :obj(data){std::cout << "Aobj  create\n";}~Aobj(){std::cout << "Aobj  delete\n";}};class  Bobj :  virtual public obj{public:Bobj(int data) :obj(data){std::cout << "Bobj  create\n";}~Bobj(){std::cout << "Bobj  delete\n";}};class ABobj :public Aobj, public Bobj{public:ABobj(int x, int y) :Aobj(x), Bobj(y){std::cout << "ABobj  create\n";}ABobj(int z) :Aobj(z), Bobj(z){std::cout << "ABobj  create\n";}~ABobj(){std::cout << "ABobj  delete\n";}};void main(){ABobj *p = new ABobj(10);//std::cout << p->num;std::cout << p->Aobj::obj::num << "\n";std::cout << p->Bobj::obj::num << "\n";delete p;std::cin.get();}

继承以及作业安排

#include <iostream> #include <amp.h> #include<thread>#include<vector>using namespace std;using namespace std::this_thread;using namespace concurrency;void run(){int v[11] = { 'G', 'd', 'k', 'k', 'n', 31, 'v', 'n', 'q', 'k', 'c' };array_view<int> av(11, v);parallel_for_each(av.extent, [=](index<1> idx) restrict(amp){av[idx] += 1;});for (unsigned int i = 0; i < 11; i++)std::cout << static_cast<char>(av[i]);std::cin.get();}int main1(){vector<thread*> threads;for (unsigned int i = 0; i < 5; i++) {threads.push_back(new thread(run));}for (auto x : threads) {x->join();}std::cin.get();return 0;}

Gpu编程

#include <iostream>  #include <amp.h>#include <WinBase.h>#define COUNT 10000float nickName_GPU[COUNT];float nickName_CPU[COUNT];double rungpu(int num)restrict(amp){double temp = 0;for (int i = 0; i < num; i++){temp += i;}return temp;}double runcpu(int num)restrict(cpu){double temp = 0;for (int i = 0; i < num; i++){temp += i;}return temp;}double runcpugpu(int num) restrict(amp, cpu){double temp = 0;for (int i = 0; i < num; i++){temp += i;}return temp;}int main(void){LARGE_INTEGER freq;LARGE_INTEGER strt;LARGE_INTEGER ed;QueryPerformanceFrequency(&freq);QueryPerformanceCounter(&strt);concurrency::array_view<float> myView(COUNT, nickName_GPU); //将数据打入显存  concurrency::parallel_for_each(myView.extent, [=](concurrency::index<1> idx) restrict(amp){for (int i = 0; i < 100000; i++){myView[idx] = (myView[idx] + 0.1f) / 2.3f;}});myView.synchronize();//显式等待GPU计算完成并将数据打回内存  QueryPerformanceCounter(&ed);printf("GPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);QueryPerformanceCounter(&strt);for (int idx = 0; idx < COUNT; idx++){for (int i = 0; i < 100000; i++){nickName_CPU[idx] = (nickName_CPU[idx] + 0.1f) / 2.3f;}}QueryPerformanceCounter(&ed);printf("CPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);for (int idx = 0; idx < COUNT; idx++){if (nickName_CPU[idx] != nickName_GPU[idx]){puts("CPU和GPU的计算结果不相符!");getchar();return 0;}}puts("测试结束");getchar();return 0;}









2 0
原创粉丝点击