详解C++-(=)赋值操作符、智能指针编写
1. (=)赋值操作符
C++中,(=)
是一种赋值操作符。它允许我们将一个值赋值给一个变量。在C++中,(=)
是右结合的,也就是说,赋值语句的右边的操作数先被计算。
例如,我们有一个类Person
,它有一个name
字符串和一个age
整数:
class Person {
string name_;
int age_;
public:
Person(string name, int age);
// other constructors, destructors and methods
};
我们可以使用赋值操作符将一个Person
对象的值赋给另一个Person
对象:
Person p1("Alice", 25);
Person p2 = p1;
在这里,我们将p1
的值赋给了p2
。这意味着p1
和p2
现在具有相同的name
和age
值。但是需要注意的是,这并不意味着p1
和p2
指向同一个对象。它们仍然是两个独立的对象,只是它们的值相同而已。
除了一般的数据类型之外,我们还可以使用赋值操作符来操作复合对象,例如数组和结构体。
2. 智能指针编写
智能指针是一种帮助我们管理动态内存分配的数据结构。它们在C++中特别有用,因为它们可以帮助我们减少内存泄漏和指针错误。
C++11中引入了两种类型的智能指针:unique_ptr
和shared_ptr
。
2.1 unique_ptr
unique_ptr
是一种独占所有权的智能指针。这意味着,一个unique_ptr
指针可以拥有一个对象的唯一所有权,并且不能与其他unique_ptr
共享。
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2;
p2 = std::move(p1);
std::cout << *p2 << std::endl; // 输出5
return 0;
}
在这个例子中,我们创建了两个unique_ptr
对象p1
和p2
,其中p1
拥有一个新的int
对象。然后,我们将p1
的所有权转移给了p2
,所以现在p2
是唯一拥有int
对象的unique_ptr
。
2.2 shared_ptr
shared_ptr
是一种允许多个指针共享同一个对象的智能指针。当一个shared_ptr
被销毁,只有在没有任何其他shared_ptr
指向该对象时,才会释放该对象。
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> p1(new int(5));
std::shared_ptr<int> p2 = p1;
std::cout << *p1 << std::endl; // 输出5
std::cout << *p2 << std::endl; // 输出5
return 0;
}
在这个例子中,我们创建了两个shared_ptr
对象p1
和p2
,它们都指向一个新创建的int
对象。由于p1
和p2
公用这个对象,因此该对象的内存只有在它们都销毁后才会被释放。
3. 示例说明
3.1 (=)赋值操作符示例
#include <iostream>
#include <string>
using namespace std;
class Person {
string name_;
int age_;
public:
Person(string name, int age) : name_{name}, age_{age} {}
Person& operator=(const Person& p) {
if (this != &p) {
name_ = p.name_;
age_ = p.age_;
}
return *this;
}
friend ostream& operator<<(ostream& os, const Person& p) {
os << "Name: " << p.name_ << ", Age: " << p.age_;
return os;
}
};
int main() {
Person p1("Alice", 25);
Person p2("Bob", 30);
cout << "p1: " << p1 << endl;
cout << "p2: " << p2 << endl;
p2 = p1;
cout << "After assignment: " << endl;
cout << "p1: " << p1 << endl;
cout << "p2: " << p2 << endl;
return 0;
}
在这个示例中,我们定义了一个Person
类,并在类中重载了(=)
赋值操作符。在main
函数中,我们创建了两个Person
对象p1
和p2
,然后将p1
的值赋给p2
,输出两个对象的值。
3.2 shared_ptr示例
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> p1(new int(5));
std::shared_ptr<int> p2 = p1;
std::cout << "p1.use_count(): " << p1.use_count() << std::endl;
std::cout << "p2.use_count(): " << p2.use_count() << std::endl;
p2.reset();
std::cout << "After resetting p2: " << std::endl;
std::cout << "p1.use_count(): " << p1.use_count() << std::endl;
std::cout << "p2.use_count(): " << p2.use_count() << std::endl;
return 0;
}
在这个示例中,我们创建了两个shared_ptr
对象p1
和p2
,并将它们都指向一个新创建的int
对象。然后我们输出每个指针的引用计数。
接下来,我们使用reset()
函数将p2
重置为空指针。在输出引用计数之后,可以看到p2
的引用计数变为了0,而p1
的引用计数仍然是1,因为它仍然指向该int
对象。
这个示例说明了shared_ptr
的共享所有权和引用计数机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++-(=)赋值操作符、智能指针编写 - Python技术站