添加直接返回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" "grammar/grammar.h" "algorithm/CAlgorithm.cpp" "algorithm/CAlgorithm.h"
) )
add_executable(algorithm_bin "algrorithm.cpp" "algorithm/ABasic.cpp" "algorithm/ABasic.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 add_executable(cppstl main.cpp
"STLUse.h" "STLUse.cpp" "STLUse.h" "STLUse.cpp"
"smart_ptr.h" "smart_ptr.cpp" "smart_ptr.h" "smart_ptr.cpp"
"../ex_object.h" "../ex_object.cpp"
) )

View File

@ -1,47 +1,22 @@
#include "ex_object.h" #include "ex_object.h"
// 左值引用与右值引用 CHouse::CHouse() : value(99)
void lrvalue()
{ {
// 左值引用与右值引用有什么区别,左值引用和右值引用的目的是什么? std::cout << "CHouse()" << std::endl;
} }
// 复制构造函数,仅接受左值。
// CHouse::CHouse(CHouse& rh) CHouse::CHouse(const CHouse& rh) : value(99)
// {
// std::cout << "构造函数(仅接受左值)" << std::endl;
// }
// 复制构造函数,左值右值均可。
CHouse::CHouse(const CHouse& rh)
{ {
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 << "CHouse(CHouse&& rv)" << std::endl;
std::cout << "移动构造函数(仅接受右值)" << std::endl;
} }
// 赋值构造函数,左右值均可。
CHouse& CHouse::operator=(const CHouse& rh) CHouse& CHouse::operator=(const CHouse& rh)
{ {
// 需要前面已经定义,否则调用的时复制构造函数。ß std::cout << "operator=(const CHouse& rh)" << std::endl;
std::cout << "赋值构造函数(左右值均可)" << std::endl;
return *this; 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> #include <iostream>
// 左值引用与右值引用
void lrvalue();
// std::move 与 类的各种构造 // std::move 与 类的各种构造
// const CHouse& rh 左右值均可。
// CHouse& rh 仅接受左值。
// CHouse&& rv 仅接受右值。
class CHouse class CHouse
{ {
public: public:
CHouse() = default; int value;
public:
CHouse();
~CHouse() = default; ~CHouse() = default;
public: public:
//CHouse(CHouse& rh); // 复制构造函数,仅接受左值。 CHouse(const CHouse& rh);
CHouse(const CHouse& rh); // 复制构造函数,左值右值均可。 CHouse(CHouse&& rv) noexcept;
CHouse(CHouse&& rv) noexcept; // 移动构造函数仅接受右值。 CHouse& operator=(const CHouse& rh);
CHouse& operator=(const CHouse& rh); // 赋值构造函数,左右值均可。
//CHouse& operator=(CHouse&& rv) noexcept; // 赋值构造函数,仅接受右值。
}; };
void demo();

View File

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