当前位置: 首页 > news >正文

公司网站没备案网页浏览器下载

公司网站没备案,网页浏览器下载,工业设计效果图,wordpress开启并调用菜单函数参数的最佳传递方式与现代C的规则 在C中,如何最佳地传递函数参数以及如何处理类的特殊成员函数,一直是优化性能和代码质量的重要话题。下面我将详细解释这些概念。 使用移动语义实现 Swap 函数 移动语义(Move Semantics)能…

函数参数的最佳传递方式与现代C++的规则

在C++中,如何最佳地传递函数参数以及如何处理类的特殊成员函数,一直是优化性能和代码质量的重要话题。下面我将详细解释这些概念。

使用移动语义实现 Swap 函数

移动语义(Move Semantics)能够提升性能的一个例子是实现一个交换(swap)函数模板,该模板交换两个对象。不使用移动语义的实现如下:

template <typename T>
void swapCopy(T& a, T& b) {T temp { a };a = b;b = temp;
}

这种实现方式会影响性能,尤其是当类型T的拷贝开销很大时。使用移动语义,实现可以避免所有拷贝:

template <typename T>
void swapMove(T& a, T& b) {T temp { std::move(a) };a = std::move(b);b = std::move(temp);
}

这就是标准库中 std::swap() 的实现方式。

在返回语句中使用 std::move()

如果返回语句的形式为 return object;,并且 object 是一个局部变量、函数参数或临时值,编译器会将其视为右值表达式,并触发返回值优化(RVO)。此外,如果 object 是一个局部变量,命名返回值优化(NRVO)也可能发生。RVO和NRVO都是拷贝省略(Copy Elision)的形式,使得从函数返回对象非常高效。

使用 std::move() 来返回对象会怎样呢?无论你写 return object; 还是 return std::move(object);,在两种情况下,编译器都会将其视为右值表达式。然而,使用 std::move(),编译器无法再应用RVO或NRVO,这可能会对性能产生重大影响!

所以,请记住以下规则:当从函数返回局部变量或参数时,只需写 return object;,不要使用 std::move()

参数的最佳传递方式

到目前为止,建议对非原始类型的函数参数使用 const 引用参数,以避免不必要的昂贵拷贝。然而,随着右值的引入,情况略有变化。想象一个无论如何都会拷贝其参数的函数。现在,你可能想要添加一个重载,以避免在右值的情况下进行任何拷贝。这里有一个例子:

class DataHolder {
public:void setData(const std::vector<int>& data) {m_data = data;}void setData(std::vector<int>&& data) {m_data = std::move(data);}private:std::vector<int> m_data;
};

但是,有一种更好的方式,涉及使用传值的单个方法。对于函数本来就会拷贝的参数,使用传值语义是最优的选择。如果传入左值,它恰好被拷贝一次。如果传入右值,不会进行拷贝。

零规则(Rule of Zero)

在现代C++中,应该遵循所谓的零规则(Rule of Zero)。这个规则指出,你应该设计你的类,使它们不需要任何特殊的成员函数。怎么做到这一点呢?基本上,你应该避免使用任何老式的动态分配内存。相反,应该使用像标准库容器这样的现代构造。例如,使用 vector<vector<SpreadsheetCell>> 替代 Spreadsheet 类中的 SpreadsheetCell** 数据成员。vector 会自动处理内存,因此不需要任何特殊的成员函数。

现代C++中推荐使用零规则,而五规则(Rule of Five)应该限于自定义的资源获取是初始化(RAII)类。RAII类获取资源的所有权,并在合适的时候处理它的释放。这是一种设计技术,例如,由 vectorunique_ptr 使用,并在后续的章节中进一步讨论。

静态方法和 const 方法是 C++ 中的两个重要概念,它们各自在不同的情况下发挥着重要作用。

静态方法(Static Methods)

静态方法是那些不依赖于类的实例而存在的方法。与静态数据成员类似,静态方法适用于整个类,而不是每个对象。在实现静态方法时,需要注意以下几点:

  • 静态方法不是针对特定对象调用的,因此它们没有 this 指针,也无法访问类的非静态成员。
  • 静态方法可以访问类的私有和保护的静态成员,也可以在具有相同类型的对象上访问私有和保护的非静态成员,前提是这些对象对静态方法可见(例如,通过作为参数传递对象的引用或指针)。
  • 在类内部的任何方法中,可以像调用常规成员函数一样调用静态方法。在类外部,需要使用作用域解析操作符(::)并带上类名来调用静态方法。

例如:

Foo::bar();

const 方法(Const Methods)

const 方法是保证不会修改任何数据成员的方法。如果你有一个 const 对象,引用到 const 或指向 const 的指针,编译器不允许你调用除非是 const 方法的任何方法。通过在方法声明时使用 const 关键字,可以保证该方法不会修改任何数据成员。

例如:

double SpreadsheetCell::getValue() const {return m_value;
}std::string SpreadsheetCell::getString() const {return doubleToString(m_value);
}
  • const 方法内部,所有数据成员都被视为 const,因此如果尝试修改数据成员,编译器会报错。
  • 不能将静态方法声明为 const,因为这是多余的。静态方法没有类的实例,因此它们无法更改内部值。
  • 在非 const 对象上可以调用 const 和非 const 方法。然而,只能在 const 对象上调用 const 方法。

mutable 数据成员(Mutable Data Members)

有时,你可能会编写一个在逻辑上是 const 的方法,但该方法恰好会更改对象的某个数据成员。这种修改对用户可见的数据没有影响,但从技术上讲是一种更改,因此编译器不允许你将方法声明为 const。在这种情况下,可以使用 mutable 关键字来声明那些即使在 const 方法中也可以被修改的数据成员。

例如:

class SpreadsheetCell {// ...
private:double m_value { 0 };mutable size_t m_numAccesses { 0 };// ...
};double SpreadsheetCell::getValue() const {m_numAccesses++;return m_value;
}std::string SpreadsheetCell::getString() const {m_numAccesses++;return doubleToString(m_value);
}

在这个例子中,即使 getValue()getString() 被标记为 const,它们也可以修改 m_numAccesses,因为它被声明为 mutable。这允许方法在保持其 const 性质的同时,对某些数据成员进行修改。


参考:Professional C++ 5Th Edition

公众号:coding日记

http://www.yayakq.cn/news/104732/

相关文章:

  • 全屏产品网站衡水做wap网站
  • 网站修改标题黑icp 网站建设
  • 设计衣服图制作软件东莞seo排名外包
  • 做网站用什么语言比较简单梁露 网站建设与实践
  • 石家庄网站制作方案贵州省新闻联播
  • 广西网站建设路做网站找模版好吗
  • 设计网站得多少钱wordpress封面外链
  • 东莞企业网站排名优化免费域名解析网站
  • 网站专业建设做电影平台网站怎么赚钱的
  • o2o网站建设代理商专业网站策划 西安
  • 怎么做能上谷歌网站手机网站转换小程序
  • 长沙建网站要多少钱企业网站建设的步骤
  • 学校网站策划书网站的推广方式组合
  • 网站站内优化方案wordpress pods使用
  • 网站开发大致需要哪些步骤广东专业网站定制
  • 网站建设dream企业网站建设经验
  • 唐山快速建站的公司微信端怎么建设网站
  • 购物网站建设需求模板下载google网站地图格式
  • 一键做单页网站建设内部网站目的
  • 哪些网站做的比较炫长春找工作哪个网站好
  • 建设部一建注册网站做网站能用的字体
  • 天津餐饮网站建设品牌营销专业
  • 服装类电子商务网站建设报告医院网站设计方案
  • 怎么用WordPress快速建站万维网申请网站域名
  • 1 分析seo做的不好的网站网站建设 软件开发的公司
  • 中国城乡建设部网站房贴文件欧铂丽全屋定制价格每平米多少钱
  • wordpress 全文字主题许昌网站seo
  • 源码网站建设步骤微信插件 wordpress
  • 网站搭建协议上海市闵行区
  • wordpress 文章缩略图seo优化教程培训