C++笔记-ClassA a和ClassA a()的区别与联系

本文通过实例解析C++中ClassA与ClassA()的区别,探讨构造函数调用机制及编译器行为,揭示指针与构造函数调用的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

前言

理论过程


 

前言

回想去年3月份找实习岗位的时候,就遇到过这种问题,当初感觉莫名其妙的。如今在工作中有幸又遇到这个问题了。百度了下发现有很多前辈对Class a与Class a()的解析很多,有深入的有浅显的。在此,我也来解析了以目前1年多点的工作经验来看看这个问题。

 

理论过程

如下代码

#include <iostream>
using namespace std;

class ClassA{

public:
	ClassA(){

		cout << "ClassA::ClassA() called!" << endl;
	}

	ClassA(const int &test){

		cout << "ClassA::ClassA(const int &test)  called!" << endl;
	}

	ClassA(const ClassA &classA){

		cout << "ClassA::ClassA(const ClassA &classA)" << endl;
	}

	ClassA(ClassA *classA){

		cout << "Class::Class(const Class *classA)" << endl;
	}

	void printfTest(){

		cout << "Hello World" << endl;
	}

};
int main(int *argc, int *argv[]){

	ClassA a;
	ClassA b();

	//ClassA *a = new ClassA;
	//ClassA *b = new ClassA();

	getchar();
	return 0;
}

运行截图如下:

这里本人用的IDE为VS2012,这里可以看到有个警告列表,指的地方正好是Class b()!

这个编译器还是比较友好的,告诉了这个没有调用构造函数!,这里我们大概也能猜到了,他估计变成了指针!

增加如下代码!

int main(int *argc, int *argv[]){

	ClassA a;
	ClassA b();

	int *c;
	void d();

	//ClassA *a = new ClassA;
	//ClassA *b = new ClassA();

	getchar();
	return 0;
}

进入反汇编!

可以发现,这个ClassA b()变成了int *c和void d()一样的东西!在此也差不多都明白了,指针在反汇编中是没有代码生成的!

修改为如下代码

int main(int *argc, int *argv[]){

	/*
	ClassA a;
	ClassA b();

	int *c;
	void d();
	*/

	ClassA *a = new ClassA;
	ClassA *b = new ClassA();

	getchar();
	return 0;
}

运行截图如下:

发现这样调用的话,编译器是知道他使用的是哪个构造函数!

把代码修改为如下代码,再测试下!

int main(int *argc, int *argv[]){

	ClassA a;
	ClassA b(a);


	getchar();
	return 0;
}

程序运行截图如下:

如果再增加这样的骚代码呢!

int main(int *argc, int *argv[]){

	ClassA a;
	ClassA b(a);
	ClassA c(ClassA());

	getchar();
	return 0;
}

运行截图:

IDE警告

他又变成指针了,

再次修改代码测试下!

int main(int *argc, int *argv[]){

	ClassA a;
	ClassA c(new ClassA);

	getchar();
	return 0;
}

运行截图如下:

呵呵,C++语法真的是复杂啊!!!!!!

因此,只要不让编译器认为他不是指针,就阔以了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值