《Effective C++》 是每个 C++ 程序员都应该读的经典之作,书中涵盖了 C++ 编程中的一系列最佳实践,包括了面向对象设计、模板、STL、异常处理等方面的内容。
由于 C++ 的发展非常迅速,书中的某些内容可能已经过时,但依然是值得好好学习的一本书。通过本书的阅读,读者能够掌握 C++ 编程的精髓,写出高效且健壮的代码。
本系列文章会对书中每项条款进行整理,以便在未来想要回顾某一条款的内容时可以最大限度地节约时间。
条款 01:建议将C++视为一个语言联邦
C++ 是一个多范式语言,支持面向过程、面向对象、泛型编程等多种编程范式。
以过程为中心,强调程序的执行过程,使用函数进行模块化设计,侧重于数据的流程化处理。
#include
void printHelloWorld()
{
std::cout << "Hello, World!" << std::endl;
}
int main()
{
printHelloWorld();
return 0;
}
以对象为中心,强调程序的结构和数据的封装,使用类进行模块化设计,侧重于数据的抽象和封装。
#include
class HelloWorld
{
public:
void print()
{
std::cout << "Hello, World!" << std::endl;
}
};
int main()
{
HelloWorld hw;
hw.print();
return 0;
}
以模板为中心,强调程序的通用性和灵活性,使用参数化类型进行模块化设计,侧重于算法的抽象和泛化。
#include
#include
template<typename T>
void printVector(const std::vector<T>& vec)
{
for (const auto& elem : vec)
{
std::cout << elem << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5};
printVector(vec);
return 0;
}
以编译时计算为中心,强调程序的元信息的处理和计算,使用模板元编程进行模块化设计,侧重于编译期间的计算和优化。
#include
#include
template<typename T>
struct is_pointer : std::false_type {};
template<typename T>
struct is_pointer<T*> : std::true_type {};
int main()
{
std::cout << std::boolalpha;
std::cout << is_pointer<int>::value << std::endl; // false
std::cout << is_pointer<int*>::value << std::endl; // true
return 0;
}
条款 01 建议将C++视为一个语言联邦,在不同的领域中使用不同的"子语言"。
C++ 支持 C 语言的大部分语法和功能,可以直接使用C语言的代码。
#include
int main() {
printf("Hello, World!\n");
return 0;
}
C++ 支持类、对象、继承等面向对象编程的概念,可以使用C++的面向对象特性进行编程。
#include
class Person {
public:
Person(std::string name, int age)
: name_(name), age_(age) {}
void say_hello() {
std::cout << "Hello, I'm " << name_ << ", " << age_ << " years old." << std::endl;
}
private:
std::string name_;
int age_;
};
int main() {
Person p("John", 25);
p.say_hello();
return 0;
}
C++ 支持模板编程,可以使用模板实现泛型编程,提高代码的复用性和可扩展性。
#include
#include
#include
template<typename T>
void print_vec(const std::vector<T>& vec) {
for (const auto& i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> v{1, 2, 3, 4, 5};
print_vec(v);
std::transform(v.begin(), v.end(), v.begin(), [](int i) { return i * 2; });
print_vec(v);
return 0;
}
C++ 标准库中提供了许多高效、通用的数据结构和算法,可以使用 STL 进行编程。
#include
#include
#include
int main() {
std::vector<int> v{1, 2, 3, 4, 5};
auto is_even = [](int i) { return i % 2 == 0; };
std::cout << std::count_if(v.begin(), v.end(), is_even)
<< std::endl;
return 0;
}
将 C++ 视为一个语言联邦的好处在于,我们可以根据具体的需求和场景,选择最适合的子语言来编写程序。
比如:如果我们需要编写高性能的代码,可以使用 C 语言来实现;如果我们需要使用面向对象的编程方式,可以使用 Object-Oriented C++;如果我们需要实现泛型编程,可以使用 Template C++;如果我们需要使用现成的数据结构和算法,可以使用 STL 等。
微信搜索“编程猿来如此”,关注公众号