`
qimo601
  • 浏览: 3438103 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

C++构造函数/析构函数 设置成private的原因

阅读更多

将构造函数,析构函数声明为私有和保护的,那么对象如何创建?
已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决,麻烦大家帮忙说明,关于构造,析构函数声明为私有和保护时的用法???
 
提出这个问题,说明你已经对c++有所思考了。

从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。
对于protected的函数,子类的“内部”的其他函数可以调用之。
而对于private的函数,只能被本类“内部”的其他函数说调用。

语法上就是这么规定的,你肯定也知道的咯。
那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?

通常使用的场景如下:
1。如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。例如:
class A
{ protected: A(){}
  public: ....
};
calss B : public A
{ public: B(){}
  ....
};

A a; // error
B b; // ok

2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”不知道你是否能明白,下面举个例子吧。
class A
{
private:
    A(){  }
    ~A(){ }

public:
    void Instance()//类A的内部的一个函数
    {
        A a;
    }
};
上面的代码是能通过编译的。上面代码里的Instance函数就是类A的内部的一个函数。Instance函数体里就构建了一个A的对象。
但是,这个Instance函数还是不能够被外面调用的。为什么呢?
如果要调用Instance函数,必须有一个对象被构造出来。但是构造函数被声明为private的了。外部不能直接构造一个对象出来。
A aObj; // 编译通不过
aObj.Instance();
但是,如果Instance是一个static静态函数的话,就可以不需要通过一个对象,而可以直接被调用。如下:class A
{
private:
    A():data(10){ cout << "A" << endl; }
    ~A(){ cout << "~A" << endl; }

    public:
    static A& Instance()
    {
        static A a;
        return a;
    }

    void Print()
    {
        cout << data << endl;
    }

private:
    int data;
};

A& ra = A::Instance();
ra.Print();

上面的代码其实是设计模式singleton模式的一个简单的C++代码实现。


还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成private,但是没有实现体。
这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。
细节请看《effective C++》里面的一个条款。具体哪个条款不记得了。

 

分享到:
评论

相关推荐

    C++构造函数与析构函数

    ### C++构造函数与析构函数详解 在学习面向对象编程的过程中,构造函数与析构函数是两个非常重要的概念。本文将围绕一个简单的股票信息类`Stock`来深入讲解这两个概念,并通过具体代码实例帮助理解。 #### 构造...

    C++构造函数析构函数

    **析构函数**是与构造函数相对的,它在对象生命周期结束时,即对象销毁前被调用,用于清理对象可能占用的资源。虽然在提供的内容中没有直接提到析构函数,但在实际编程中,析构函数通常用来释放动态分配的内存或其他...

    构造函数与析构函数_构造函数ppt_

    在编程领域,特别是面向对象编程(Object-Oriented Programming,OOP)中,构造函数与析构函数是两个至关重要的概念。它们在类的生命周期管理中扮演着核心角色,确保对象的正确初始化和清理。本PPT文件"3.1构造函数...

    详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数

    详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数  编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为: class String { public: String(const char *str = NULL); // 普通...

    高质量C++C编程指南 - 第9章 类的构造函数、析构函数与赋值函数.pdf

    "高质量C++编程指南 - 第9章 类的构造函数、析构函数与赋值函数" 本章主要介绍了C++类中的三个基本函数:构造函数、析构函数与赋值函数。这些函数看似简单,但如果不正确地使用它们,可能会导致程序出错。 首先,...

    c++(7) 构造和析构函数

    构造函数与析构函数是C++中非常重要的概念,它们对于确保类实例的正确初始化与清理至关重要。本文将详细介绍构造函数与析构函数的相关知识点。 #### 一、构造函数 构造函数是一种特殊成员函数,其主要任务是在对象...

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    在自定义类设计中,通常需要实现四个特殊成员函数:普通构造函数、拷贝构造函数、析构函数和赋值运算符。这些函数是面向对象编程中的核心组成部分,对于理解和创建高效、安全的对象至关重要。 **普通构造函数**: ...

    C++构造函数,复制构造函数和析构函数专题[1].pdf

    总之,理解并熟练运用构造函数、复制构造函数、析构函数、继承、虚函数和多态性是掌握C++面向对象编程的关键。它们共同构成了C++强大而灵活的类层次结构和对象模型,为复杂软件设计提供了坚实的基础。通过深入研究和...

    构造、析构函数

    构造函数与析构函数是C++中非常重要的概念,它们在对象的生命周期管理中扮演着核心角色。构造函数主要用于初始化对象,而析构函数则负责清理对象占用的资源。 #### 构造函数 构造函数是一种特殊的成员函数,其名称...

    类、构造函数、析构函数.pdf

    如果未声明析构函数,编译器也会提供一个默认的公共析构函数。 拷贝构造函数是一种特殊的构造函数,用于通过已存在的对象创建新对象。拷贝构造函数的特点: - 名称与类名相同。 - 接受一个对同类对象的引用作为参数...

    C++高级程序设计实验三-类和对象构造函数与析构函数

    ### C++高级程序设计实验三-类和对象构造函数与析构函数 #### 实验目的与内容概述 本次实验旨在加深对C++中类和对象的理解,特别是构造函数与析构函数的应用。实验包含了以下几个主要目标: 1. **理解掌握 this ...

    详解C++中如何将构造函数或析构函数的访问权限定为private

    在C++编程语言中,将构造函数或析构函数的访问权限设置为private是一种常见的设计模式,通常用于实现单例模式或者控制对象的创建和销毁。单例模式确保一个类在整个程序运行期间只存在一个实例。下面我们将详细探讨这...

    析构或构造函数声明为保护或私有成员

    标题“析构或构造函数声明为保护或私有成员”所对应的知识点主要是关于C++语言中构造函数和析构函数的访问控制。 在C++语言中,构造函数和析构函数可以被声明为私有或保护成员,以达到特定的设计目的。将构造函数和...

    java kok 构造与析构函数

    在Java编程语言中,"构造函数"和"析构函数"是两个关键概念,它们在对象的生命周期管理中起着至关重要的作用。首先,我们来深入理解这两个概念。 构造函数,顾名思义,是在创建类的对象时被调用的特殊方法。它的主要...

    析构函数应用

    析构函数是C++类中的一个特殊成员函数,主要用于释放对象在构造时所分配的资源。与构造函数相对应,当一个对象生命周期结束(例如对象所在的函数调用结束或者程序正常结束),析构函数会被自动调用。 #### 二、析构...

    数据结构单链表

    //析构函数 int Length(); //求单链表的长度 T Get(int i); //按位查找,查找单链表中的第i个元素的数值 int Locate(T x); //查找该元素在单链表中的位置 void Insert(int i, T x); //在第i个位置插入该元素 T...

    C++面试试题-拷贝构造函数

    ### C++面试试题详解:拷贝构造函数 #### 背景介绍 在C++编程中,拷贝构造函数是一个非常重要的概念,尤其对于那些处理复杂数据结构或资源管理的程序来说更是如此。拷贝构造函数是类的一种特殊成员函数,用于创建一...

    C++ 矩形类 (包括数据成员和函数成员)

    通过完成本次实验,不仅加深了对类、对象、构造函数、析构函数的理解,还学会了如何在C++中设计和实现一个具有具体功能的类。此外,实验过程中的调试经历也提高了问题解决能力和代码调试技巧。 总之,面向对象编程...

Global site tag (gtag.js) - Google Analytics