(3)、最好不要使用"using"关键字, 以保证名字空间下的所有名称都可以正常使用.
// 禁止 —— 污染名字空间 using namespace foo;(4)、在.cc文件,.h文件的函数,方法或类中,可以使用"using"关键字.
// 允许: .cc 文件中 // .h 文件的话, 必须在函数, 方法或类的内部使用 using ::foo::bar;(5)、在.cc文件,.h文件的函数,方法或类中,允许使用名字空间别名.
// 允许: .cc 文件中 // .h 文件的话, 必须在函数, 方法或类的内部使用 namespace fbz = ::foo::bar::baz;嵌套类:当公有嵌套类作为接口的一部分时,虽然可以直接将他们保持在全局作用域中,但将嵌套类的声明置于名字空间内是更好的选择.
在一个类内部定义另一个类;嵌套类也被称为成员类(memberclass).
class Foo {
private:
// Bar是嵌套在Foo中的成员类
class Bar {
…
};
};优点:当嵌套(或成员)类只被类使用时非常有用;把它作为类作用域内的成员, 而不是去污染外部作用域的同名类.嵌套类可以在类中做前置声明,然后在.cc文件中定义,这样避免在类的声明中定义嵌套类, 因为嵌套类的定义通常只与实现相关.
缺点:嵌套类只能在类的内部做前置声明.因此,任何使用了Foo::Bar*指针的头文件不得不包含类Foo的整个声明.
结论:不要将嵌套类定义成公有,除非它们是接口的一部分,比如,嵌套类含有某些方法的一组选项.
非成员函数、静态成员函数和全局函数:使用静态成员函数或名字空间内的非成员函数,尽量不要用裸的全局函数.
优点:某些情况下,非成员函数和静态成员函数是非常有用的,将非成员函数放在名字空间内可避免污染全局作用域.
缺点:将非成员函数和静态成员函数作为新类的成员或许更有意义,当它们需要访问外部资源或具有重要的依赖关系时更是如此.
结论:(1)、有时,把函数的定义同类的实例脱钩是有益的,甚至是必要的.这样的函数可以被定义成静态成员,或是非成员函数.非成员函数不应依赖于外部变量,应尽量置于某个名字空间内.相比单纯为了封装若干不共享任何静态数据的静态成员函数而创建类,不如使用命名空间.(2)、定义在同一编译单元的函数,被其他编译单元直接调用可能会引入不必要的耦合和链接时依赖;静态成员函数对此尤其敏感.可以考虑提取到新类中,或者将函数置于独立库的名字空间内.(3)、如果你必须定义非成员函数,又只是在.cc文件中使用它,可使用匿名名字空间或static链接关键字(如static int Foo() {...})限定其作用域.
局部变量:将函数变量尽可能置于最小作用域内,并在变量声明时进行初始化.
C++允许在函数的任何位置声明变量.我们提倡在尽可能小的作用域中声明变量,离第一次使用越近越好.这使得代码浏览者更容易定位变量声明的位置,了解变量的类型和初始值.特别是,使用初始化的方式替代声明再赋值, 比如:
int i; i = f(); // 坏——初始化和声明分离 int j = g(); // 好——初始化时声明注意,GCC可正确实现了 for(int i = 0; i < 10; ++i) (i的作用域仅限for循环内),所以其他for循环中可以重新使用i.在if和while等语句中的作用域声明也是正确的,如:
while (const char* p = strchr(str, ‘/’)) str = p + 1;Warning:如果变量是一个对象,每次进入作用域都要调用其构造函数,每次退出作用域都要调用其析构函数.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-4.html
非金钱非利益能定而
你是喝到肚子
尤其是军备