相关疑难解决方法(0)

C++中指针变量和引用变量之间有什么区别?

我知道引用是语法糖,因此代码更容易读写.

但有什么区别?


以下答案和链接摘要:

  1. 指针可以重新分配任意次数,而在绑定后无法重新分配引用.
  2. 指针可以指向nowhere(NULL),而引用总是指对象.
  3. 您不能使用指针来获取引用的地址.
  4. 没有"参考算术"(但您可以获取引用所指向的对象的地址,并对其进行指针运算&obj + 5).

澄清一个误解:

C++标准非常谨慎,以避免规定编译器如何实现引用,但每个C++编译器都将引用实现为指针.也就是说,声明如下:

int &ri = i;
Run Code Online (Sandbox Code Playgroud)

如果它没有完全优化,则分配与指针相同的存储量,并将地址i放入该存储中.

因此,指针和引用都使用相同数量的内存.

作为基本规则,

  • 使用函数参数和返回类型中的引用来提供有用的自我文档化接口.
  • 使用指针实现算法和数据结构.

有趣的读物:

c++ pointers reference c++-faq

3115
推荐指数
34
解决办法
94万
查看次数

迈耶斯如何实施单身人士实际上是一个单身人士

我一直在阅读很多关于单身人士的信息,他们应该和不应该使用它们,以及如何安全地实施它们.我正在用C++ 11编写,并且遇到了Meyer对单例的懒惰初始化实现,如本问题所示.

这个实现是:

static Singleton& instance()
{
     static Singleton s;
     return s;
}
Run Code Online (Sandbox Code Playgroud)

我理解这对于SO的其他问题是如何线程安全的,但我不明白的是这实际上是一个单例模式.我用其他语言实现了单例,这些总是像维基百科这样的例子:

public class SingletonDemo {
        private static volatile SingletonDemo instance = null;

        private SingletonDemo() {       }

        public static SingletonDemo getInstance() {
                if (instance == null) {
                        synchronized (SingletonDemo .class){
                                if (instance == null) {
                                        instance = new SingletonDemo ();
                                }
                      }
                }
                return instance;
        }
}
Run Code Online (Sandbox Code Playgroud)

当我看第二个例子时,这是一个单例,它是非常直观的,因为该类拥有对其自身的一个实例的引用,并且只返回该实例.但是,在第一个示例中,我不明白这是如何防止存在对象的两个实例的.所以我的问题是:

  1. 第一个实现如何强制执行单例模式?我假设它与static关键字有关,但我希望有人能够深入地向我解释发生在幕后的事情.
  2. 在这两种实现方式之间,是否优于另一种?优缺点都有什么?

谢谢你的帮助,

c++ singleton design-patterns c++11

43
推荐指数
2
解决办法
3万
查看次数

标签 统计

c++ ×2

c++-faq ×1

c++11 ×1

design-patterns ×1

pointers ×1

reference ×1

singleton ×1