今天把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++中的机构体的区别