From c567cb30d18682866d6e3e73a09ebc46eb690389 Mon Sep 17 00:00:00 2001 From: taynpg Date: Thu, 14 Mar 2024 10:16:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B4=E6=8E=A5=E8=BF=94?= =?UTF-8?q?=E5=9B=9Evector=E6=8B=B7=E8=B4=9D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cppbase/CMakeLists.txt | 5 ++++- cppbase/STL/CMakeLists.txt | 1 + cppbase/ex_object.cpp | 45 +++++++++----------------------------- cppbase/ex_object.h | 21 +++++++++--------- cppbase/object.cpp | 4 ++-- cppbase/src/verify.cpp | 26 ++++++++++++++++++++++ cppbase/src/verify.h | 6 +++++ 7 files changed, 59 insertions(+), 49 deletions(-) create mode 100644 cppbase/src/verify.cpp create mode 100644 cppbase/src/verify.h diff --git a/cppbase/CMakeLists.txt b/cppbase/CMakeLists.txt index f1c5ddd..d05f3cc 100644 --- a/cppbase/CMakeLists.txt +++ b/cppbase/CMakeLists.txt @@ -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") \ No newline at end of file +add_executable(object_bin "object.cpp" + "src/verify.h" "src/verify.cpp" + "ex_object.h" "ex_object.cpp" + ) \ No newline at end of file diff --git a/cppbase/STL/CMakeLists.txt b/cppbase/STL/CMakeLists.txt index 568aa51..57fad12 100644 --- a/cppbase/STL/CMakeLists.txt +++ b/cppbase/STL/CMakeLists.txt @@ -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" ) diff --git a/cppbase/ex_object.cpp b/cppbase/ex_object.cpp index 5d5ceab..dd42b3a 100644 --- a/cppbase/ex_object.cpp +++ b/cppbase/ex_object.cpp @@ -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)); } \ No newline at end of file diff --git a/cppbase/ex_object.h b/cppbase/ex_object.h index 9b04344..49f85a0 100644 --- a/cppbase/ex_object.h +++ b/cppbase/ex_object.h @@ -2,22 +2,21 @@ #include -// 左值引用与右值引用 -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(); \ No newline at end of file diff --git a/cppbase/object.cpp b/cppbase/object.cpp index 74d43e4..c40e578 100644 --- a/cppbase/object.cpp +++ b/cppbase/object.cpp @@ -1,8 +1,8 @@ #include +#include "src/verify.h" int main() { - - + verify_basic_container(); return 0; } \ No newline at end of file diff --git a/cppbase/src/verify.cpp b/cppbase/src/verify.cpp new file mode 100644 index 0000000..248a8e4 --- /dev/null +++ b/cppbase/src/verify.cpp @@ -0,0 +1,26 @@ +#include "verify.h" +#include "../ex_object.h" +#include +#include + +std::vector get_house() +{ + std::vector house; + house.resize(5); + return house; +} + +void verify_basic_container() +{ + // 1.直接返回 + // MSVC 可直接返回。 + // GNU 未测试 + // CLANG 未测试 + std::vector data = get_house(); + for (const auto& item : data) { + std::cout << item.value << " "; + } + std::cout << "\n"; + + std::cout << "End." << std::endl; +} \ No newline at end of file diff --git a/cppbase/src/verify.h b/cppbase/src/verify.h new file mode 100644 index 0000000..5763ae2 --- /dev/null +++ b/cppbase/src/verify.h @@ -0,0 +1,6 @@ +#ifndef VERIFY_HEADER +#define VERIFY_HEADER + +void verify_basic_container(); + +#endif // VERIFY_HEADER