繁体   English   中英

无需在C ++中复制即可使变量不可更改

[英]Make variable unchangeable without copying in C++

我正在编写一些代码,在这些代码中,在指定值之前声明了std::vector<double>类型的变量。 我无法与声明一起定义值,因为它需要多行代码来设置值。 问题在于,这个变量本质上是一个常量,这意味着它一旦设置就不应该被修改。 但是,它不能声明为const

一种方法是创建另一个const变量并将值复制到其中。 const std::vector<double> a(b); 会这样做,并在程序中使用a而不是b 但是,我的变量可能很大,我希望学习除了必须执行复制之外的其他方法。

你们有什么建议吗?

您可以创建一个函数来初始化它。 在最坏的情况下,你有一个move 充其量你有(N)RVO(返回值优化)。

std::vector<Object> CreateBigVector();

接着

const std::vector<Object> myObject = CreateBigVector();

我认为问题在于范围界定 您必须将问题分成两个不同的范围

  • 构建向量的范围
  • 您使用它的一个(或其他)范围

构建 vector的范围内,它在逻辑上不是const变量。 一旦你构建它,你希望它不再被改变。 所以你可能想通过const &引用它。

我会这样走:

  • 定义函数std::vector<double> build_up()
  • build_up ,你定义了一个非const vector ,你可以构建它
  • 当你完成后,你可以按值返回( RVO将避免任何副本)
  • build_up()返回的对象称为const对象

const std::vector<double> v = build_up();

一种方法是创建一个函数

std::vector<Object> CreateYourVector();

并用它来初始化

const std::vector<Object> vec = CreateYourVector();

另一个(技术上是一种变体)是创建一个包含vector的辅助类,并在构造函数中完成所有工作

class Helper
{
     std::vector<Object> vec;

     public:

         Helper()
         {
               // initialise your vector here
         };

         const std::vector<Object> &TheVec() const {return vec;};
};

const Helper helper;

可以组合上述技术,例如改变构造函数

Helper() : vec(CreateYourVector()) {};

这些技术也可以与其他技术混合,例如单例模式。

c++11 ,您可以使用initial list来定义const vector 我认为这是最简单的方法。 试一试: const vector<double> = {1.0, 2.0, 3.0}; 设置值不需要多行代码。 我希望这可以帮到你。

传统的方法是仅公开一个强制执行const的句柄,并避免在创建和初始化向量的上下文之外制作昂贵的副本。 这样的句柄将是一个const指针或引用。

由于你使用的是std::vector你可以从现代的c ++工具中受益,因为std::vector支持像现成的移动语义这样的功能。

特别是,我建议您预算一段时间来查看:

  • 移动语义
  • 智能指针

它改进了传递原始指针的传统方式。 它们强制执行所有权语义(该上下文拥有该​​对象),并允许您通过代码以非常精确的方式表达您的意图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM