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

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

#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 10000

float 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;
}

版权声明:本博客所有文章均为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!

时间: 2024-10-13 22:28:34

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

ORACLE函数之单行转换函数

 1           ASCIISTR 格式:ASCIISTR(C) 说明:将字符串C转换为ASCII字符串,即将C中的ASCII字符保留不变,但非ASCII字符则以ASCII表示返回 举例: SQL>SELECT ASCIISTR('AB?CDE数据库') A FROM DUAL; A --------------------- AB?CDE\6570\636E\5E93 2           BIN_TO_NUM 格式:BIN_TO_NUM(n1,n2,n3...) 说明:每位由n

Mysql日期转换函数、时间转换函数

Mysql日期转换函数.时间转换函数 一.MySQL 获得当前日期时间 函数 1,获得当前日期+时间(date + time)函数:now(): select now(); 结果:2008-08-08 22:20:46 2,获得当前日期+时间(date + time)函数:sysdate()sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值: select sysdate(); 结果:2008-08

NumPy常用函数(一)——构造数组函数及代码示例

NumPy是Python的一个科学计算的基本模块.它是一个Python库,提供了一个多维数组对象,各种衍生对象(如屏蔽数组和矩阵),以及用于数组,数学,逻辑,形状操纵,排序,选择,I/O等快速操作的各种例程 离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等. 本文主要列出构造数组常用的函数或者成为子模块 一.0-1数组 empty(shape [,dtype,order])                      返回给定形状和类型的新数组,而不初始化条目. empty_like(a

Oracle函数大全之转换函数

chartorowid(c1) [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SELECT chartorowid('AAAADeAABAAAAZSAAA') FROM DUAL; [说明] 在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件.块.行上. 在重复的记录中,可能所有列的内容都相同,但r

ORACLE常用数值函数、转换函数、字符串函数

本文并不准备介绍全部的oracle函数,当前情势下,俺也还没这个时间,需要学习的东西太多了,要把多数时间花在学习经常能用上的技术方面:),所以如果是准备深入了解所有oracle函数的朋友,还是去关注:Oracle SQL Reference官方文档更靠谱一些. 本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表示数字型,C表示字符型,D表示日期型,

SQL单行函数和多行函数

单行函数和多行函数示意图: 单行函数分为五种类型:字符函数.数值函数.日期函数.转换函数.通用函数 单行函数: [sql] view plaincopy --大小写控制函数 select lower('Hello World') 转小写, upper('Hello World') 转大写 from dual; --initcap: 首字母大写 select initcap('hello world') 首字符大写 from dual; --字符控制函数 -- concat: 字符连接函数, 等同

GPU编程中的常用数学函数

在GPU编程中,函数一般分为以下几种类型:数学函数.几何函数.纹理映射函数.偏导数函数.调试函数等.熟练利用好GPU自带函数,可以在一定程度上提高并行编程速度与效率. 关于数学数学函数(Mathematical Functions) 数学函数用于执行数学上常用计算,比如:三角函数.幂函数.向量和矩阵函数,这些函数一般都被重载,用来支持标量数据和不同长度的向量作为输入参数.列表如下: 标准函数库中的数学函数 未完待续......

GPU编程中的常用几何函数、纹理映射函数、偏导数函数

在GPU编程中,函数一般分为以下几种类型:数学函数.几何函数.纹理映射函数.偏导数函数.调试函数等.熟练利用好GPU自带函数,可以在一定程度上提高并行编程速度与效率. 在上一部分已经介绍了数学函数, 数学函数用于执行数学上常用计算,比如:三角函数.幂函数.向量和矩阵函数,这些函数一般都被重载,用来支持标量数据和不同长度的向量作为输入参数.本部分介绍几何函数.纹理映射函数.偏导数函数.调试函数. 几何函数(Geometric Functions) 几何函数,如表所示,用于执行和解析几何相关的计算,

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直