龙空技术网

non-member、non-friend替换member函数、泛型解释

明政面朝大海春暖花开 83

前言:

此刻咱们对“置换算法代码”可能比较讲究,各位老铁们都想要剖析一些“置换算法代码”的相关内容。那么小编同时在网上网罗了一些对于“置换算法代码””的相关知识,希望同学们能喜欢,我们快快来了解一下吧!

《Effective C++》中的这个条款主要是指在设计类的成员函数时,应该尽可能地将它们设计为非成员函数,而不是成员函数。这样做的好处是可以提高代码的封装性和灵活性。

具体来说,如果一个函数只需要访问类的公共接口,而不需要访问类的私有数据成员,那么就可以将这个函数设计为一个非成员函数,而不是将它设计为一个成员函数。这样做的好处是可以避免将类的私有数据成员暴露给外部,提高了代码的封装性。

此外,将函数设计为非成员函数还可以提高代码的灵活性。如果将一个函数设计为成员函数,那么这个函数只能在该类的对象上调用。而将一个函数设计为非成员函数,可以在任何对象上调用,这样可以更加灵活地使用代码。

总之,宁以non-member、non-friend替换member函数的意思是尽可能地将函数设计为非成员函数,这样可以提高代码的封装性和灵活性。

您提供一个简单的C++类的设计和声明示例:

// 声明一个名为Person的类class Person {  private: // 私有成员变量    string name; // 姓名    int age; // 年龄  public: // 公有成员函数    Person(string n, int a); // 构造函数    void setName(string n); // 设置姓名    void setAge(int a); // 设置年龄    string getName(); // 获取姓名    int getAge(); // 获取年龄};// 实现类的构造函数Person::Person(string n, int a) {  name = n;  age = a;}// 实现设置姓名的成员函数void Person::setName(string n) {  name = n;}// 实现设置年龄的成员函数void Person::setAge(int a) {  age = a;}// 实现获取姓名的成员函数string Person::getName() {  return name;}// 实现获取年龄的成员函数int Person::getAge() {  return age;}

以上代码定义了一个名为Person的类,包含私有成员变量name和age,以及公有成员函数构造函数、设置姓名、设置年龄、获取姓名和获取年龄。通过这个示例,您可以了解到如何设计和声明一个C++类,并实现其中的成员函数。

C++中的模板是一种泛型编程的工具,它可以让我们编写具有通用性的代码,从而实现更高效、更灵活的程序设计。下面是一个简单的例子,演示了如何使用模板来实现一个通用的排序算法:

#include <iostream>#include <vector>#include <algorithm>template <typename T>void mysort(std::vector<T>& vec) {    std::sort(vec.begin(), vec.end());}int main() {    std::vector<int> vec1 = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};    std::vector<double> vec2 = {3.14, 2.71, 1.41, 1.61, 1.73, 2.72};        mysort(vec1);    mysort(vec2);        for (auto x : vec1) {        std::cout << x << " ";    }    std::cout << std::endl;        for (auto x : vec2) {        std::cout << x << " ";    }    std::cout << std::endl;        return 0;}

在这个例子中,我们定义了一个名为mysort的模板函数,它接受一个std::vector类型的参数,并使用std::sort算法对其进行排序。由于mysort是一个模板函数,因此可以接受任意类型的std::vector,包括int和double。在main函数中,我们分别使用mysort对两个不同类型的std::vector进行排序,并输出结果。

C++中,我们通常会将一些操作封装在类的成员函数中,比如:

class MyClass {public:    void doSomething() {        // do something    }};

这样的话,我们就可以通过类的对象来调用这个成员函数:

MyClass obj;obj.doSomething();

但是,在某些情况下,我们可能更倾向于将这个操作设计为一个非成员函数,比如:

void doSomething(MyClass& obj) {    // do something}

这样的话,我们就可以直接调用这个函数,而不需要先创建一个对象:

MyClass obj;doSomething(obj);

这种设计方式的好处是,它可以使代码更加灵活,因为我们可以在不修改类定义的情况下,为类添加新的操作。同时,这种方式还可以避免一些不必要的依赖关系,使代码更加简洁和易于维护。

举个例子,假设我们有一个名为Point的类,表示二维平面上的一个点。我们可以将计算两个点之间距离的操作封装为一个成员函数:

class Point {public:    double distanceTo(const Point& other) const {        double dx = x - other.x;        double dy = y - other.y;        return std::sqrt(dx * dx + dy * dy);    }private:    double x;    double y;};

这样的话,我们就可以通过点对象来计算它们之间的距离:

Point p1, p2;double distance = p1.distanceTo(p2);

但是,我们也可以将这个操作设计为一个非成员函数:

double distanceBetween(const Point& p1, const Point& p2) {    double dx = p1.x - p2.x;    double dy = p1.y - p2.y;    return std::sqrt(dx * dx + dy * dy);}

这样的话,我们就可以直接调用这个函数,而不需要先创建两个点对象:

Point p1, p2;double distance = distanceBetween(p1, p2);

这种设计方式的好处是,它可以避免我们在计算两个点之间距离时,必须先创建两个点对象,从而使代码更加简洁和易于维护。

在C++中,我们通常使用成员函数来操作类的私有成员变量和方法。但是,有时候我们需要在类外部定义一些函数来操作类的私有成员变量和方法,这时候就需要使用非成员函数来实现。

举个例子,假设我们有一个名为Rectangle的类,其中有私有成员变量width和height,以及一个公有成员函数area()用来计算矩形的面积。现在我们想要实现一个非成员函数来计算两个矩形的面积之和,而不是使用Rectangle类的成员函数。

这时候,我们可以定义一个名为sumOfAreas()的非成员函数来实现这个功能,代码如下:

class Rectangle {private:    int width;    int height;public:    Rectangle(int w, int h) : width(w), height(h) {}    int area() const { return width * height; }};int sumOfAreas(const Rectangle& r1, const Rectangle& r2) {    return r1.area() + r2.area();}int main() {    Rectangle r1(3, 4);    Rectangle r2(5, 6);    int sum = sumOfAreas(r1, r2);    std::cout << "The sum of the areas is: " << sum << std::endl;    return 0;}

在这个例子中,我们定义了一个非成员函数sumOfAreas(),它接受两个Rectangle对象作为参数,并返回它们面积之和。在main()函数中,我们创建了两个Rectangle对象r1和r2,然后调用sumOfAreas()函数来计算它们的面积之和,并输出结果。

需要注意的是,我们在sumOfAreas()函数中调用了Rectangle类的成员函数area()来计算矩形的面积。这是因为area()函数是Rectangle类的一部分,我们无法在类外部直接访问私有成员变量width和height。但是,我们可以通过类的公有接口来访问这些成员变量,也就是通过area()函数来计算面积。

总之,非成员函数可以用来操作类的私有成员变量和方法,它们可以提供更灵活的设计和更好的封装性。

在C++中,我们通常使用成员函数来操作类的私有成员变量和方法。但是,有时候我们需要在类外部定义一些函数来操作类的私有成员变量和方法,这时候就需要使用非成员函数来实现。

举个例子,假设我们有一个名为Rectangle的类,其中有私有成员变量width和height,以及一个公有成员函数area()用来计算矩形的面积。现在我们想要实现一个非成员函数来计算两个矩形的面积之和,而不是使用Rectangle类的成员函数。

这时候,我们可以定义一个名为sumOfAreas()的非成员函数来实现这个功能,代码如下:

class Rectangle {private:    int width;    int height;public:    Rectangle(int w, int h) : width(w), height(h) {}    int area() const { return width * height; }};int sumOfAreas(const Rectangle& r1, const Rectangle& r2) {    return r1.area() + r2.area();}int main() {    Rectangle r1(3, 4);    Rectangle r2(5, 6);    int sum = sumOfAreas(r1, r2);    std::cout << "The sum of the areas is: " << sum << std::endl;    return 0;}

在这个例子中,我们定义了一个非成员函数sumOfAreas(),它接受两个Rectangle对象作为参数,并返回它们面积之和。在main()函数中,我们创建了两个Rectangle对象r1和r2,然后调用sumOfAreas()函数来计算它们的面积之和,并输出结果。

需要注意的是,我们在sumOfAreas()函数中调用了Rectangle类的成员函数area()来计算矩形的面积。这是因为area()函数是Rectangle类的一部分,我们无法在类外部直接访问私有成员变量width和height。但是,我们可以通过类的公有接口来访问这些成员变量,也就是通过area()函数来计算面积。

总之,非成员函数可以用来操作类的私有成员变量和方法,它们可以提供更灵活的设计和更好的封装性。

标签: #置换算法代码