C++工作笔记-结构体与类的进一步探究(在C++中的结构体,非C语言结构体)

今天把Qt Creator中的项目放到VS上,使用MSVC编译器发现跑不动链接错误,报的是如下的这个错误:

我在Qt上用MinGW明明不会报错,而他却说链接不到,日了个狗。

后面根据报错提示,我把如下信息(把类的声明换成了结构体的声明就阔以了):

改成了这样的代码:

程序就跑起来了!

因此就有了这篇对类与结构体的博文(使用的编译器为MSVC2015,不使用MinGw):

首先来看一下这个代码:

#include <iostream>
using namespace std;

class emptyClass {

};

struct  emptyStruct{

};

struct BaseStruct
{
	int value1=1;
	int value2=2;
	void function1() {
		cout << "function1 in BaseStruct called" << endl;
	}
};

class BaseClass {
public:
	int value1=1;
	int value2=2;
	void function1() {
		cout << "function1 in BaseClass called" << endl;
	}
};



void main() {

	cout << "emptyClass size:" << sizeof(emptyClass) << "  emptyStruct size:" << sizeof(emptyStruct) << endl;

	BaseStruct basestruct;
	basestruct.function1();

	BaseClass baseclass;
	baseclass.function1();

	getchar();
	return;
}

运行截图如下:

发现在空类和空结构体上,类和结构体并没有特别的区别。唯一的区别就是每个C++开发者都知道的尝试,一个默认私有,一个默认公有。

查看这两个内存地址(发现都是先放value1,再放value2)

下面这个是basestruct

下面这个是baseclass

为什么分布是这样的,这里有个大小端的知识点,在此不解释

看这篇博文:https://mp.csdn.net/postedit/61210305

修改BaseStruct与BaseClass的源码如下:

struct BaseStruct
{
	int value1=1;
	int value2=2;
	void function1() {
		cout << "function1 in BaseStruct called" << endl;
	}

	BaseStruct() {
		cout << "BaseStruct construction called" << endl;
		this->function1();
	}
};

class BaseClass {
public:
	int value1=1;
	int value2=2;
	void function1() {
		cout << "function1 in BaseClass called" << endl;
	}
	BaseClass() {
		cout << "BaseClass construction called" << endl;
		this->function1();
	}
};

程序运行截图如下:

你没有看错,相当的狗血,在C++里面的结构体竟然能用this指针,这是多么狗血的事情啊?简直就是一个披着结构体名字的类。既然连this指针也有,那么继承,纯虚函数,抽象类(不这应该叫抽象结构体),泛型应该都有,

下面来验证一下:

源码如下:

#include <iostream>
using namespace std;

struct Base {
	virtual void print() {
		cout << "Base struct print" << endl;
	}
};

struct Child : public Base{
	void print() {
		cout << "Child struct print" << endl;
		Base::print();
	}
};

void main(){

	Child child;
	child.print();
	getchar();
}

运行截图如下:

是不是很狗血,感觉自己读了假的大学,在读大学的时候,老师天天说结构体是多么辣鸡,类是多么6,但他们真的知道C++里面的结构体和C++里面的类的区别吗!

下面来验证下抽象类(应该叫抽象结构体)

源码如下:

#include <iostream>
using namespace std;

struct Base {
	virtual void test() = 0;
	virtual void print() {
		cout << "Base struct print" << endl;
	}
};

struct Child : public Base{
	void print() {
		cout << "Child struct print" << endl;
		Base::print();
	}

	void test() {
		cout << "test called" << endl;
	}
};

void main(){

	Child child;
	child.print();
	child.test();
	getchar();
}

运行截图如下:

阔怕,现在来看看泛型:

源码如下:

#include <iostream>
using namespace std;

template<typename T>
struct  MyStruct
{
	T x;
	T y;
	MyStruct(T a,T b):x(a),y(b){}
	friend ostream& operator<<(ostream &os, MyStruct mystruct) {
		os << "(" << mystruct.x << "," << mystruct.y << ")";
		return os;
	}
};

void main() {
	MyStruct<int> myStruct1(1, 2);
	MyStruct<double> myStruct2(1.001, 1.002);
	cout << "myStruct1:" << myStruct1 << endl;
	cout << "myStruct2:" << myStruct2 << endl;

	getchar();
}

运行截图如下:

结论:

1.C++里面的结构体和类在使用成面并没有什么不同;

2.就名字不同,其他都一样;

3.一般都把struct当成数据集合,把class当成功能集合(这个和const的用途有点点类似)

但在MSVC里面为什么会有错误呢,我觉得应该是这个编译器比较严格,严格区分类和结构体这个名字,MinGw就不会这样。

这也是C语言中的结构体与C++中的机构体的区别

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81773490