天天看点

C++中 *A什么意思 A*什么意思;智能指针及lambda表达式

作者:明政面朝大海春暖花开

在C++中,*A表示指针A所指向的地址上存储的值,也可以称为“间接引用”或“解引用”。而A*表示定义一个指向A类型对象的指针。例如:

```

int a = 10;

int* p = &a; // 定义一个指向int类型变量a的指针p

cout << *p; // 输出p所指向的地址上存储的值,即10

```

```

class MyClass {

// 类定义

};

MyClass* p = new MyClass(); // 定义一个指向MyClass类型对象的指针p

```

在这个例子中,`new`操作符会分配一块内存,用于存储MyClass类型的对象,并返回这个对象的地址,p指向这个地址。

好的,让我们分别介绍一下C++的智能指针和lambda表达式。

智能指针是一种C++中的智能对象,它能够自动管理动态分配的内存。C++中有三种智能指针:unique_ptr、shared_ptr和weak_ptr。其中,unique_ptr是独占所有权的智能指针,它保证了只有一个指针可以指向一个对象,当unique_ptr被销毁时,它所指向的对象也会被销毁。shared_ptr是共享所有权的智能指针,它允许多个指针指向同一个对象,当最后一个指向该对象的shared_ptr被销毁时,该对象才会被销毁。weak_ptr是一种弱引用,它不会增加对象的引用计数,也不会阻止对象被销毁,但可以用于检查对象是否已被销毁。

下面是一个使用unique_ptr的例子:

```

#include <iostream>

#include <memory>

int main() {

std::unique_ptr<int> ptr(new int(42));

std::cout << *ptr << std::endl;

return 0;

}

```

lambda表达式是C++11引入的一种匿名函数,它可以用来创建一个临时的函数对象,用于简化代码和提高代码的可读性。lambda表达式的语法如下:

```

[capture list] (parameters) -> return_type { function body }

```

其中,capture list用于捕获外部变量,可以是值捕获或引用捕获;parameters是函数的参数列表;return_type是返回值类型;function body是函数体。

下面是一个使用lambda表达式的例子:

```

#include <iostream>

#include <vector>

#include <algorithm>

int main() {

std::vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

int count = std::count_if(nums.begin(), nums.end(), [](int n) { return n % 2 == 0; });

std::cout << "There are " << count << " even numbers." << std::endl;

return 0;

}

```

这个例子中,lambda表达式用于在vector中查找偶数的个数,函数体中的return语句返回一个bool值,用于判断一个数是否为偶数。

右值引用(Rvalue reference)是C++11引入的一种新的引用类型,用于支持移动语义和完美转发。右值引用可以绑定到一个临时对象(右值),并且可以将其转移给另一个对象,而不是进行拷贝或移动构造函数。这使得在一些情况下可以避免不必要的对象拷贝和构造函数的调用,从而提高程序的性能。

在C++11中,通过使用&&符号来定义右值引用。例如:

```

int&& a = 5; // a是一个右值引用,绑定到临时对象5上

```

右值引用还可以用于实现完美转发,即将一个函数的参数按照原样转发给另一个函数,而不需要进行拷贝或移动构造函数。这在泛型编程中非常有用。

右值引用是C++11引入的一种新的引用类型,它可以绑定到右值(临时对象、表达式结果等)上,用于实现移动语义和完美转发等高效的语言特性。在C++中,左值表示一个具有内存地址的对象,而右值则表示一个临时的、不具有内存地址的值。右值引用的语法是使用双引号&&来声明,例如:

```

int&& a = 10; // a是一个右值引用,绑定到一个临时的整数值上

```

右值引用最常用的场景是实现移动语义,即将一个对象的资源所有权从一个对象转移到另一个对象,避免了不必要的内存拷贝和析构。例如:

```

class A {

public:

A(A&& other) { // 移动构造函数

// 将other的资源移动到this中

}

};

A a1; // 创建一个A对象

A a2(std::move(a1)); // 使用移动构造函数将a1的资源移动到a2中

```

除了移动语义,右值引用还可以用于实现完美转发,即在函数调用时将参数以原始类型传递,避免了不必要的类型转换和拷贝。例如:

```

template<typename T>

void foo(T&& t) { // 使用右值引用实现完美转发

bar(std::forward<T>(t)); // 将t以原始类型传递给bar函数

}

```

总的来说,右值引用是C++11中非常重要的一个语言特性,可以用于实现高效的移动语义和完美转发,提高程序的性能和可维护性。