SEO做得最好的网站,如何做网站定位,怎么浏览国外的设计网站,办公家具一、介绍
学习C的开发者都知道#xff0c;在C的类定义中#xff0c;传统的会有常见的六个默认和构造相关的函数#xff08;不明白的可以去查一下资料#xff09;。但在实际情况中#xff0c;经常会遇到一些具体的开发场景#xff0c;只用这几个函数可能还是会导致重复代…一、介绍
学习C的开发者都知道在C的类定义中传统的会有常见的六个默认和构造相关的函数不明白的可以去查一下资料。但在实际情况中经常会遇到一些具体的开发场景只用这几个函数可能还是会导致重复代码的出现。开发者在学习编程之初估计都会有人不断告诉你只要有重复代码就有优化的可能性。 但是如果代码的重复到了最基础的阶段开发者一般就无能为力了即使使用了一些特殊的技巧也会导致代码的可读性和可维护性的降低。本篇主要是分析构造函数在重载和继承时遇到的重复代码的问题。
二、委托构造函数Delegating constructors
委托构造函数非常好理解就是一个构造函数委托调用另外一个构造函数来实现。这样做的好处是显而易见的不需要在两个及以上的构造函数上写重复的代码。比如一个类中有两个以上的构造函数他们都要对至少两个以上的相同变量进行赋值那么委托构造函数的优势就体现出来。下面看一下代码就清楚了
#include iostreamclass Example {
public:Example() : Example(0) {}//Example() : data_(d), len_(10), height_(10) {}//旧标准Example(int d) : data_(d), len_(10), height_(10) {}Example(const Example ex) : Example(ex.data_) {}//旧标准同上注释~Example() {}public:void Display() { std::cout data_,len_,heigth_ value: data_ , len_ , height_ std::endl; }private:int data_;int len_;int height_;
};
int main() {Example ex;ex.Display();Example ex1(ex);ex.Display();return 0;
}上面的代码很清晰不再多言。这里说明一下为什么拷贝构造函数使用传引用一是值传递复制不断重复产生递归调用导致栈溢出另外一个是提高效率引用不需要再拷贝一个副本 。
三、继承构造函数Inheriting Constructors
和上面一样如果在继承中出现类似的现象即子类调用父类的数据对象大多重复并且自身基本不需要再次处理的那么在传统的C代码中还是需要手动一个个的写出来而在C11的继承构造函数出现后就可以简化使用。
class Base {
public:Base() : data_(3) {}Base(int d) : data_(d), len_(10), height_(10) {}Base(int d, int l, int h) : data_(d), len_(l), height_(h) {}void Display(int d) { std::cout cur vlaue is: d std::endl; }void Display(int d1, int d2) { std::cout cur vlaue is: d1 d2 std::endl; }protected:int data_;int len_;int height_;
};
class Derived : public Base {
public:using Base::Base;using Base::Display;// Derived() {}// Derived(int d) : Base(d) {}// Derived(int d, int l, int h) : Base(d, l, h) {}void Display() { std::cout data_,len_,heigth_ value: data_ , len_ , height_ std::endl; }
};int main() {Derived d(2, 3, 6);d.Display();d.Display(2);d.Display(2, 3);return 0;
}
同样被重名继承隐藏的函数通过使用using也可以展现出来。 此处需要注意的是C是支持多重继承的如果在多重继承里则无法使用这种方式只能老实的按老的方式手动一个个的写代码。
四、总结
前面反复分析过语言的发展一定是向简单和自然化推进这是一个方向不可逆转的。而C标准的前进也是如此上面的两个例子其实就是这样的。换句话说如果现在看到编程时仍然有重复的或者不方便的地方甚至啰嗦的地方在未来的新标准中一定会修正。无数的例子已经出现了这个只要跟着标准前进的开发者都深有体会。