【C/C++】类和结构

本文探讨了C++中结构体(struct)与类(class)的主要区别,即成员变量的默认访问权限不同,并通过示例代码说明了结构体如何拥有构造函数、析构函数和成员函数。此外,还解析了一段包含潜在编译错误的代码。
摘要由CSDN通过智能技术生成

问题1:

structure是否可以拥有constructor/destructor及成员函数?如果可以,那么structure和class还有什么区别么?

问题2:

现有以下代码,则编译时会产生错误的是()。

struct Test
{
	Test(int) {}
	Test() {}
	void fun() {}
}; 

int main()
{
	Test a(1); 		// 语句1
	a.fun(); 		// 语句2
	Test b(); 		// 语句3
	b.fun(); 		// 语句4
	return 0; 
}

A. 语句1

B. 语句2

C. 语句3

D. 语句4

======================================================================================

问题1解析:

答案:区别是class中变量默认值为private,struct中的变量默认public。struct可以有构造函数、析构函数,之间也可以继承,等等。C++中的struct其实和class意义一样,唯一不同的就是struct里面默认的访问控制是public,class中默认的访问控制是private。C++中保存struct关键字的唯一意义就是为了让C程序员有个归属感,是为了让C++编译器兼容以前用C开发的项目。

扩展知识:

我们可以写一段struct继承的例子,代码如下:

#include <iostream>
using namespace std; 
enum BREED {GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB}; 
struct Mammal
{
	public : 
		Mammal(): itsAge(2), itsWeight(5) {}
		~Mammal() {}
		
		int GetAge() const { return itsAge; }
		void SetAge(int age) { itsAge = age; }
		int GetWeight() const { return itsWeight; }
		void SetWeight(int weight) { itsWeight = weight; }
		
		void Speak() const { cout << "\nMammal sound!"; }
		void Sleep() const { cout << "\nMammal sleep."; }
	
	protected : 
		int itsAge; 
		int itsWeight; 
}; 

struct Dog : public Mammal
{
	public :
		Dog(): itsBreed(GOLDEN) {}
		~Dog() {}
		BREED GetBreed() const { return itsBreed; }
		void SetBreed(BREED breed) { itsBreed = breed; }
		void WagTail() const { cout << "Tail wagging...\n"; }
		void BegForFood() const { cout << "Begging for food...\n"; }
	
	private :
		BREED itsBreed; 
}; 

int main()
{
	Dog fido; 
	fido.Speak(); 
	fido.WagTail(); 
	cout << "Fido is " << fido.GetAge() << " years old \n"; 
	return 0; 
}

问题2解析:

Test b()这个语法等同于声明了一个函数,函数名为b,返回值为Test,传入参数为空。但实际上,代码作者是希望声明一个类型为Test,变量为b的变量,应该写成Test b;,但程序中这个错误在编译时是检测不出来的。出错的是语句4“b.fun();”,它是编译不过去的。

答案:D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值