私有化,拷贝

类中的私有化

我们在创建类后,一般会定义变量。
1.变量有私有变量 和 公有变量xx
2.私有变量有__xx和_x两种形式,前者的私有属性最大,不能让自己的子类和外部访问;而后者可以让自己的子类调用,也不可以让外部访问调用,例如用 from 文件名 import * 来导入另一个个文件时,_x 的不被访问,调用。

property

  1. 私有属性中添加 getter和setter方法
    一般用@property 和 @xx.setter 和@xx.getter
    目的是为了将方法转化为只读 ;重新实现一个属性的设置和读取方式,可做边界判断。

在python中有许多的关键词,再此 我介绍一下 == 和 is 的一点区别。

  1. == 号只是判断两个对象是否相等,两个对象的id可以是不同的,也可以是相同的。
  2. is 是比较两个引用是否指向同一个对象,这两个对象的ID是相同的。
    来举个栗子
a = [1,3,2]
b = a 
if a == b: #在这里,a与b的值是相同的,而且id也是相同的
	print(True) #结果一定是True
else:
print(False)
a = [1,3,2]
b = [1,3,2]
if a == b :#在这里,a与b的值是相同的,但id是不同的
	print(True) #结果一定是True
else:
print(False)
a = [1,3,2]
b = a 
if a is b :#这里的a和b 值相等,而且id也是相等的。
	print(True)#结果是True
else:
	print(False)
a = [1,3,2]
b = [1,3,2]
if a is b :#这里的a和b 值虽然相等,但是id不相等。
	print(True)
else:
	print(False)#结果一定是False

拷贝

浅拷贝
浅拷贝就是拿来用一下,没有给它确切的存储地址。

a = [1,2,3,4]
b = a#这时,就可以当做是b拷贝了a的内容,地址没有发生变化

深拷贝
深拷贝则是复制了内容,到另一个地方,不用因为前者左右

import copy #导入拷贝模块
a = [1,2,3,4]
print(id(a))
b = copy.deepcopy(a)
print(id(b))#id(a)和id(b)l两者是不一样的

浅拷贝对于可变类型和不可变类型的copy是不一样的

# import copy
# #对可变数据
# a = '123'
# b = (4,5,6,)
# d = [a,b]
# print(d)
# c = copy.deepcopy(a)#深拷贝
# bb = c[:]
# print(id(bb))
# print(id(a))
# # if a is c :
# # 	print(True)
# # else:
# # 	print(False)
# '''用直接拷贝的时候(浅拷贝)(就是不使用import copy)
# 不可变数据是浅拷贝, 可变数据是深拷贝'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当一个类中存在指针类型的成员变量时,如果使用默认的浅拷贝构造函数和赋值运算符重载函数,会导致多个对象共享同一块内存空间,从而出现潜在的内存泄漏或者程序崩溃等问题。 例如,假设有一个包含指针成员变量的类 `MyClass`: ```cpp class MyClass { public: MyClass(int size) { data = new int[size]; // ... 初始化 data } ~MyClass() { delete[] data; } private: int* data; }; ``` 如果使用默认的浅拷贝构造函数和赋值运算符重载函数,会导致不同的对象共享同一块内存空间: ```cpp MyClass a(10); MyClass b = a; // 调用浅拷贝构造函数 MyClass c(5); c = a; // 调用浅拷贝赋值运算符重载函数 ``` 此时,对于 `a`、`b` 和 `c` 三个对象,它们的 `data` 指针都指向同一块内存空间。当其中一个对象释放内存时,其他对象的 `data` 指针也会变成野指针,从而出现内存泄漏或者程序崩溃等问题。 解决方法是实现类的深拷贝构造函数和赋值运算符重载函数,使得每个对象都拥有独立的内存空间: ```cpp class MyClass { public: MyClass(int size) { data = new int[size]; // ... 初始化 data } ~MyClass() { delete[] data; } MyClass(const MyClass& other) { // 深拷贝构造函数 data = new int[size]; memcpy(data, other.data, sizeof(int) * size); } MyClass& operator=(const MyClass& other) { // 深拷贝赋值运算符重载函数 if (this != &other) { delete[] data; data = new int[size]; memcpy(data, other.data, sizeof(int) * size); } return *this; } private: int* data; }; ``` 这样,对于 `a`、`b` 和 `c` 三个对象,它们的 `data` 指针指向不同的内存空间,互不影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值