菜鸟资源网站全面焕新升级啦!全新的界面设计,简洁而不失雅致,让您一目了然,轻松上手。我们还对资源分类进行了细致梳理,确保各类资源条理清晰,便于您按需筛选与查找。 立即查看
通知图标

正在访问 第八章:掌握变量定义的位置与时机,了解C++基本语言特性变量和类型

第八章:掌握变量定义的位置与时机,了解C++基本语言特性变量和类型

第八章:掌握变量定义的位置与时机,了解C++基本语言特性变量和类型

  变量是 C/C++代码的重要组成部分,几乎所有的 C/C++代码都存在变量的影子,既有内置类型的,也有自定义类型的。虽然变量很常见,但合理和高效地使用它们也有一定的玄机和技巧。掌握这些技巧,在合适的时机把变量定义在合适的位置,会提高代码...

当前版本

软件大小

软件语言

是否破解

  变量是 C/C++代码的重要组成部分,几乎所有的 C/C++代码都存在变量的影子,既有内置类型的,也有自定义类型的。虽然变量很常见,但合理和高效地使用它们也有一定的玄机和技巧。掌握这些技巧,在合适的时机把变量定义在合适的位置,会提高代码的可读性和高效性。

  C89中规定,在执行任何语句之前,在块的开头声明本语句块使用的所有局部变量,否则此语句块将无法通过编译。而 C99 和 C++则没有这样的规定,即在首次使用之前,可在块的任何位置声明变量。这从一定程度上降低了定义一个不适用的变量的概率。

  或许你认为不会愚蠢到定义一个不适用的变量,但话不要说得这么绝对。考虑下面这个函数的实现:

//从字符串指定位置处提取后续字符串
string GetSubStr(const string &str, size t iPos)
{
  string strSubStr;
  if(str.size()<iPost)
  {
    throw logic_error( "iPos is too larger!");
  }
  strSubStr = str.substr(iPos);
  return strSubStr;
}

  在上述这段代码中,对象 strSubStr 并未完全被使用。如果函数抛出异常,你得付出 strSubStr构造和析构代价。所以最好延迟strSubStr对象定义,直到真正需要 strSubStr时再定义,代码如下:

//从字符串指定位置处提取后续字符串
string GetSubStr(const string &str, size t iPos)
{
  if(str.size()<iPost)
  {
    throw logic_error("iPos is too larger! ");
  }
  string strSubStur;
  strSubStr= str.substr(iPos);
  return strSubStr;
}

  但是上面的函数实现依然不是最优的,strSubStr 虽然定义了,但是未对它进行任何初始化,也就是说在赋值之前 strSubStr 已经进行了default 构造初始化。

  更受欢迎的做法是直接通过初始化的方法实现,跳过毫无意义的default 构造过程,代码如下:

//从字符串指定位置处提取后续字符串
string GetSubStr(const string &str, size_t iPos)
{
  if(str.size()<iPost)
  {
        throw logic_ error("iPos is too larger!");
  }
  string strSubStr(str.substr(iPos));
  returm strSubStr;
}

   关于变量的位置,建议变量定义得离使用位置越近越好,尽量避免变量作用域的膨胀。通过这种方式可以有效减少命名污染问题,同时可以提高代码的可读性和执行效率。尽量延后变量的定义,直到非得使用变量前的那一时刻。同样应尽量尝试延后变量定义,直到延迟到可给变量初始化位置。因为这样不仅可以避免构造和析构非必需对象,还可以避免毫无意义的 default构造行为。

  命名污染是指来自不同模块的全局变量或外部函数的名称重复,从而导致链接失败,或链接后产生错误的执行结果(链接器在静态函数库查找符号时,将按顺序查找静态函数,找到某个匹配的符号后,就不会查找其他函数库中是否含有相同的符号名)。大型项目一般由多个开发人员并行开发,由命名污染造成的程序运行错误是很难发现的。因此,我们在开发之前就要采取必要的措施来避免此类问题。在 C+中通常采用的措施有:命名空间,以及延迟变量定义的位置。

  还有一个特殊的地方需要注意,这就是循环。如果变量定义在循环体内使用,那么把它定义于循环体内还是循环体外呢?也即下面两种应用模式哪个更好呢?

//方法A:变量定义在循环体外
ClassAobj;
for (inti=0; i<n; i++)
{
    Obi=与i相关的某个值;
}
//方法B:变量定义在循环体内
for(inti=0;i<n;i++)
{
    ClassAobj=与i相关的某个值;
}

  方法A和方法B两种应用模式,操作代价可总结如下。方法A:1个ClassA构造+n 个赋值操作+1 个 ClassA 析构;方法 B:n 个 ClassA 构造+n 个 ClassA 析构。可以看出,当n 很大时,如果赋值操作代价较高,则方法B较好;如果构造和析构代价较高,则方法A比较好。

  请谨记

  ● 在定义变量时,请三思而行。掌握变量定义的位置和时机。尽量延迟变量定义的位置,只有到了不得不定义时,才定义变量。

  ● 减少变量名污染,提高代码的可读性,减少变量的作用域。

第八章:掌握变量定义的位置与时机,了解C++基本语言特性变量和类型
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

常见问题

  • 如何安装和激活?

    每款软件会附带有安装教程,您打开安装包一目了然

  • 程序是否已损坏?文件损坏?还是其他错误?

    有错误问题,请您参考:https://www.xxx.com/error

  • 如何更新?正式激活后会发生什么情况?

    除非安装说明中另有说明,否则官方更新可能会导致无法激活。 要从本网站更新软件,您需要在此处下载此软件的新版本(如果可用),并将其安装在计算机上安装的版本之上(替换)。在这种情况下,您将保存此软件的激活和设置。

  • 如何下载?链接不起作用?

    我们使用百度网盘,132云盘和微软网盘,除了百度网盘,其他两款不限速,如果链接失效,请您联系客服处理

  • 已发布更新。我什么时候升级我的版本?

    所有软件如有更新,我们第一时间推送,视自己情况更新使用

  • 如何更改语言?

    打开“系统偏好设置”->“通用>语言和地区”->应用程序-“+”。 选择应用和语言。此方法适用于大多数应用程序。 Adobe 产品中的语言通常是在产品本身的安装阶段选择的。 游戏中的语言通常会在游戏本身的设置中发生变化。

  • 如何删除软件?

    有很多选择。最简单的方法是使用特殊的实用程序来卸载应用程序,例如App Cleaner Uninstaller 要删除 Adobe 产品,请使用 Creative Cloud Cleaner Tool

  • 需要远程帮助吗?

    网站已开通永久会员的可享受免费远程,如果非永久会员,远程安装另外收费

给TA打赏
共{{data.count}}人
人已打赏
技术教程

第七章:局部变量和全局变量的差别,了解C++基本语言特性变量和类型

2024-2-16 11:22:00

技术教程

新版宝塔的 SQL 注入漏洞

2024-2-17 12:53:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
后退
榜单