C++权限

class和struct的唯一区别就是权限不一样。

  1. class默认的属性是private。
  2. struct默认的属性是public。
  3. 事实上在内存存储上也没有区别,只是编译器给访问上进行了限制。
  4. 继承上有区别,struct默认public,继承后可以访问父类。class想要访问父类class的成员,必须首先将自己的成员都声明为public,并且继承时注明要public的方式继承(因为默认继承是私有的)。
struct test
{
	int a;
	int b;
};
struct sub:test
{
	int x;
	int y;
};
//更改默认属性,此时仍然不可以访问
class test
{
public:
	int a;
	int b;
};
class sub:test
{
public:
	int x;
	int y;
};
//更改继承方式,可以访问。
class test
{
public:
	int a;
	int b;
};
class sub:public test
{
public:
	int x;
	int y;
};

如果在结构/类种写函数的实现,会使得结构/类变的非常庞大,所以应该在结构中只写函数的声明,具体的实现放到外面。

void Test::Init(int x,int y, int y);冒号代表一种范围,告诉编译器这个函数不是普通函数,这个函数属于哪个结构。

#include<stdio.h>
#include<malloc.h>

class Test
{
	int x;
	int y;
	int z;
	void Init(int x,int y,int z);
	void Function();
	void Function1();
	void Function2();
	void Function3();
};
void Test::Init(int x,int y,int z)
{
}
void Test::Function()
{
}
void Test::Function1()
{	
}
void Test::Function2()
{
}
void Test::Function3()
{
}
int main(int argc,char *argv[])
{
	return 0;
}

public:这个成员谁都可以用,不用担心被修改,所以,一旦发布成public的成员,是不能够改名字的。

private:这个成员只允许在内部使用,不要在其他的地方使用。

  1. 对外提供的变量或者函数,发布成public的,但不能随意改动。
  2. 可能会变动的变量或者函数,定义成private的,这样编译器会在使用的时候做检测。
  3. 只有结构体内部的函数才能访问private的成员。
  4. publice/private可以修饰函数也可以修饰变量。
  5. 存储值的变量都应该定义成私有的,想访问时通过内部函数访问。
#include<stdio.h>
#include<malloc.h>
#include"class.h"

struct person 
{
private:
	int age;
public:
	int SetAge(int age)
	{
		if(age<0 || age >100)
		{
			printf("input error!\n");
			return -1;
			
		}else
			this->age = age;
	}
	int GetAge(void)
	{
			return age;
	}
	void print(void)
	{
		printf("age = %d\n",this->age);
	}
};

void tsetfunction(void)
{
	person p;
	int x;
	p.SetAge(200);
	p.print();
	p.SetAge(-2);
	p.print();
	p.SetAge(60);
	p.print();
	x= p.GetAge();
	printf("%d\n",x);
}
int main(int argc,char *argv[])
{
	tsetfunction();
	return 0;
}

不管是private还是public,在内存中存放是一样的,不允许访问私有数据只是编译器不让访问,通过指针强制访问也可以访问。

#include<stdio.h>
#include<malloc.h>
#include"class.h"

struct test
{
private:
	int x;
public:
	int y;
	void Init(int x,int y)
	{
		this->x = x;
		this->y = y;
	}
};
void tsetfunction(void)
{
    test t;
	t.Init(2,3);
	int *p = (int *)&t;
	printf("x = %d\n",*p);
	printf("y = %d\n",*(p+1));
}
int main(int argc,char *argv[])
{
	tsetfunction();
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雲烟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值