添加直接返回vector<Foo>拷贝测试“

This commit is contained in:
taynpg 2024-03-14 10:16:04 +08:00
parent ca66456a83
commit c567cb30d1
7 changed files with 59 additions and 49 deletions

View File

@ -9,4 +9,7 @@ add_executable(cppbase
"grammar/grammar.h" "algorithm/CAlgorithm.cpp" "algorithm/CAlgorithm.h"
)
add_executable(algorithm_bin "algrorithm.cpp" "algorithm/ABasic.cpp" "algorithm/ABasic.h")
add_executable(object_bin "object.cpp")
add_executable(object_bin "object.cpp"
"src/verify.h" "src/verify.cpp"
"ex_object.h" "ex_object.cpp"
)

View File

@ -6,4 +6,5 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(cppstl main.cpp
"STLUse.h" "STLUse.cpp"
"smart_ptr.h" "smart_ptr.cpp"
"../ex_object.h" "../ex_object.cpp"
)

View File

@ -1,47 +1,22 @@
#include "ex_object.h"
// 左值引用与右值引用
void lrvalue()
CHouse::CHouse() : value(99)
{
// 左值引用与右值引用有什么区别,左值引用和右值引用的目的是什么?
std::cout << "CHouse()" << std::endl;
}
// 复制构造函数,仅接受左值。
// CHouse::CHouse(CHouse& rh)
// {
// std::cout << "构造函数(仅接受左值)" << std::endl;
// }
// 复制构造函数,左值右值均可。
CHouse::CHouse(const CHouse& rh)
CHouse::CHouse(const CHouse& rh) : value(99)
{
std::cout << "构造函数(左值右值均可)" << std::endl;
std::cout << "CHouse(const CHouse& rh)" << std::endl;
}
// 移动构造函数仅接受右值。
CHouse::CHouse(CHouse&& rv) noexcept
CHouse::CHouse(CHouse&& rv) noexcept : value(99)
{
// 移动语义要修改rv的值,故不能使用const。
std::cout << "移动构造函数(仅接受右值)" << std::endl;
std::cout << "CHouse(CHouse&& rv)" << std::endl;
}
// 赋值构造函数,左右值均可。
CHouse& CHouse::operator=(const CHouse& rh)
{
// 需要前面已经定义,否则调用的时复制构造函数。ß
std::cout << "赋值构造函数(左右值均可)" << std::endl;
std::cout << "operator=(const CHouse& rh)" << std::endl;
return *this;
}
// 赋值构造函数,仅接受右值。
// CHouse& CHouse::operator=(CHouse&& rv) noexcept
// {
// std::cout << "赋值构造函数(仅接受右值)" << std::endl;
// return *this;
// }
void demo()
{
CHouse houseA;
CHouse houseB = std::move(houseA);
CHouse houseC = houseB;
houseA = houseB;
CHouse houseD(houseC);
CHouse houseE(std::move(houseD));
}

View File

@ -2,22 +2,21 @@
#include <iostream>
// 左值引用与右值引用
void lrvalue();
// std::move 与 类的各种构造
// const CHouse& rh 左右值均可。
// CHouse& rh 仅接受左值。
// CHouse&& rv 仅接受右值。
class CHouse
{
public:
CHouse() = default;
int value;
public:
CHouse();
~CHouse() = default;
public:
//CHouse(CHouse& rh); // 复制构造函数,仅接受左值。
CHouse(const CHouse& rh); // 复制构造函数,左值右值均可。
CHouse(CHouse&& rv) noexcept; // 移动构造函数仅接受右值。
CHouse& operator=(const CHouse& rh); // 赋值构造函数,左右值均可。
//CHouse& operator=(CHouse&& rv) noexcept; // 赋值构造函数,仅接受右值。
CHouse(const CHouse& rh);
CHouse(CHouse&& rv) noexcept;
CHouse& operator=(const CHouse& rh);
};
void demo();

View File

@ -1,8 +1,8 @@
#include <iostream>
#include "src/verify.h"
int main()
{
verify_basic_container();
return 0;
}

26
cppbase/src/verify.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "verify.h"
#include "../ex_object.h"
#include <vector>
#include <iostream>
std::vector<CHouse> get_house()
{
std::vector<CHouse> house;
house.resize(5);
return house;
}
void verify_basic_container()
{
// 1.直接返回
// MSVC 可直接返回。
// GNU 未测试
// CLANG 未测试
std::vector<CHouse> data = get_house();
for (const auto& item : data) {
std::cout << item.value << " ";
}
std::cout << "\n";
std::cout << "End." << std::endl;
}

6
cppbase/src/verify.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef VERIFY_HEADER
#define VERIFY_HEADER
void verify_basic_container();
#endif // VERIFY_HEADER