首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c ++:私有构造函数意味着在头文件中没有该类对象的定义?

在C++中,私有构造函数意味着该类不能被实例化,因为构造函数是用于初始化对象的。将构造函数设置为私有可以防止外部创建该类的对象。这种做法通常用于工具类或单例模式中,确保类的对象只能通过特定的方法或函数来创建和访问。

在头文件中,类的定义和实现是分开的。类的定义包括类的属性和方法的声明,而实现则包括方法的定义。私有构造函数不会影响类的定义,因此头文件中仍然可以看到该类的定义。

例如:

代码语言:cpp
复制
class MyClass {
public:
    static MyClass& getInstance();

private:
    MyClass() {} // 私有构造函数
};

在这个例子中,MyClass的构造函数是私有的,因此不能在其他地方直接创建该类的对象。但是,类的定义仍然可以在头文件中看到。

总之,私有构造函数不会影响类的定义,因此头文件中仍然可以看到该类的定义。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++对象和类关系_类对象只能访问该类私有成员

定义一个类时,相当于定义了一个数据类型蓝图。但实际上并没有定义任何数据,但它定义了类名称意味着什么,也就是说,类对象由什么组成及在这个对象上可执行什么操作,就是单纯进行了一个定义。...所有类或成员,任何代码均可访问该项,访问权限最大也就意味着最不安全 Private访问修饰符:范围:私有的,只有类内部可以进行访问,允许一个类将其成员变量和成员函数对其他函数对象进行隐藏。...只有同一个类函数可以访问它私有成员。即使是类实例也不能访问它私有成员。...类和内嵌类成员,只有派生类可以访问该项; Internal访问修饰符:范围:内部,默认,程序集内部可以访问,允许一个类将其成员变量和成员函数暴露给当前程序其他函数对象。...换句话说,带有internal访问修饰符任何成员可以被定义该成员所定义应用程序内任何类或方法访问。

1.6K10

C++】继承 ⑦ ( 继承对象模型分析 | 继承构造函数和析构函数 )

一、继承对象模型分析 1、继承代码示例 下面有 3 个类 , 分别是 A 类 , B 类 , C 类 ; A 类是 基类 ; B 类 公有继承 A 类 , 并定义了新 成员变量 y ; C 类...int 类型空间 ; 3、问题引入 - 派生类对象构造函数和析构函数调用 上述 继承 过程 , 每一层继承 , 都继承了上一级 父类 成员变量 , 同时自己也定义了新成员变量 ; 派生类对象...构造时 , 构造函数如何进行调用 ; 派生类对象 析构时 , 析构函数如何进行调用 ; 本篇博客开始讨论上述问题 ; 4、完整代码示例 - 派生类对象内存模型 #include "iostream...system("pause"); return 0; } 二、继承构造函数和析构函数 ---- 1、子类构造函数与析构函数调用顺序 继承构造函数和析构函数 : 子类构造 : 子类对象 进行..." << endl; } } 如果 A 类 没有 默认构造函数 , B 类构造函数 必须 显式调用 A 类构造函数 , 并传入 A 类构造函数参数 ; class B : public A {

23040
  • C++】类和对象):类默认成员函数构造函数、析构函数、拷贝构造函数、运算符重载

    共3点: 1.如果类没有显示定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户显示定义,编译器就不再生成。...析构函数不是完成对对象本身销毁,比如局部对象是存在栈帧函数结束,栈帧销毁,他就释放了不需要我们管。C++规定对象销毁时会自动调用析构函数,完成对象中资源清理释放工作。...4.C++规定自定义类型对象进行拷贝行为必须调用拷贝构造。...C语言中实参传给形参就是直接拷贝过去,不会调用一个函数C++传值传参要调用拷贝函数。 我们直接调用拷贝构造函数时,因为是引用传参,就不会形成新拷贝函数。..._day; } 但是我们不可以类外访问私有的成员,这些_year, _month, _day都是私有成员,那咋办? 用友元函数类里面加上下面这句话。

    8810

    C++】构造函数分类 ② ( 不同内存创建类实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

    一、不同内存创建类实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了...栈内存 变量 Student s1 ; 这些都是 栈内存 创建 类实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 类 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数

    17320

    Dart 定义构造函数私有属性和方法、set与get、初始化列表

    Dart是一门使用类和单继承面向对象语言,所有的对象都是类实例,并且所有的类都是Object子类。 1. Dart类定义 ? 2. Dart类构造函数 ? 3....Dart命名构造函数 ? 4. Dart中将类抽离成一个单独模块 首先将模块写到一个单独文件,如下图所示为public文件夹下Person.dart为一个单独类。 ?...Dart私有属性和私有方法 Dart和其他面向对象语言不一样,没有 public、private、protected这些访问修饰符,但是我们可以使用下划线把一个属性或者方法定义私有。...需要注意是,定义私有属性和私有方法类必须要抽离放在一个单独文件,然后才能真正起到私有的效果。 首先将含有私有属性或私有方法类放在一个单独模块。 ?...文件引入含有私有属性和私有方法类。 ? 6. Dartget与set修饰符 ? 7. Dart初始化列表 Dart可以构造函数体运行之前初始化实例变量。 ?

    6.3K40

    C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )

    文章目录 类定义 ( 头文件引用次数控制 ) 类实现 ( 构造函数 | 析构函数 ) CMake 编译配置 类测试 ( 构造析构调用测试 ) 类定义 ( 头文件引用次数控制 ) ---- 类定义..., 类一般定义一个单独文件 , C++ 文件名不像 Java 一样必须与类名相同 , C++ 文件名可以与类名不相等 , 一般情况下尽量让类名与文件名一致 ; 创建头文件 , 右键点击源码路径...STUDENT_H 类定义 : Student.h 声明该类 ; 使用 class 关键字声明类 , 在其中可以定义属性和方法 ; C++ 类属性和方法有三种作用域 , 分别是 private...#define STUDENT_H //使用 class 关键字 声明类 class Student { //默认作用域 : 如果没有指定作用域, 其作用域默认是 private 私有的 //类属性定义...头文件 , 然后实现类声明构造函数与析构函数 , 该类就可以使用了 ; 如果没有实现其构造函数与析构函数 , 直接使用该类会报错 ; 实现构造函数与析构函数 , 需要用到域作用符 , 使用 Student

    67020

    C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )

    文章目录 成员函数 常量函数 友元函数 new 创建对象 友元类 单例类 成员函数 ---- 此处继续上一篇博客继续向后讲解C++面向对象 类成员方法 , 除了定义构造方法与析构方法之外 ,...不管构造函数 , 还是成员函数申请内存 , 都需要在析构函数 , 将内存释放掉 ; Student.h 相关声明 : //默认作用域 : 如果没有指定作用域, 其作用域默认是 private..., 有两种方法 , 一种是使用共有的成员方法访问 , 另一种是友元函数访问 ; 常量函数 , 头文件函数定义时 , 方法后面加上 const 关键字 , 这个函数就变成了常量函数 , 该函数不允许修改类成员变量...可以访问类对象私有成员变量和方法 ; 003_Object_Oriented.cpp ( main函数定义文件 ) 中友元函数实现 //引用 Student 类声明头文件 #include "Student.h...() 构造方法 age : 88 ~Student() 析构方法 友元类 ---- 友元类 , 友元类中所有的成员函数都是该类友元函数 , 可以访问该类对象私有成员变量 ; 友元类声明 , 声明友元类方法

    51220

    c++ | 训练01

    类不是定义定义数据成员时初始化数据成员 // 9. 通过称为构造函数特殊成员函数控制初始化 // 10. 类头文件,名字使用前必须先声明或定义 // 11....由多个文件组成程序需要一种方法连接名字使用和声明,c++通过头文件实现 // 12. 头文件一般包含类定义,extern变量声明和函数声明。 // 13....操作符定义为非成员函数时,通常必须将他们设置为锁操作类友元 // 3. 某些情况下,允许特定非成员函数访问一个类私有成员,同时仍然阻止一般访问。 // 4....构造函数初始化是一系列成员名,每个成员后面是括圆括号初始值 // 6. 多个成员初始化用逗号分隔 // 7....内置类型成员初始值依赖于对象如何定义,如果对象全局作用域中定义(即不在任何函数),或定义为静态局部对象,这些成员将被初始化为0 // 11.

    28410

    后台开发:核心技术与应用实践 -- C++

    C语言中, struct 不能定义成员函数,而在 C++ ,增加 class 类型后 ,扩展了 struct 功能,struct 也能定义成员函数了。...对象存储空间 对于一个空类,里面既没有数据成员,也没有成员函数该类对象大小为1Byte。 类静态数据成员不占对象内存空间,同时,成员函数包括构造函数和析构函数也是不占空间。...同时,无论哪一种继承方式,派生类是不能访问基类私有 成员私有成员只能被本类成员函数所访问,毕竟派生类与基类不是同一个类 构造派生类对象时,必须对基类数据成员、新增数据成员和成员对象数据成员进行初始化...纯虚函数基类声明函数,它在基类没有定义,但要求任何派生类都要定义自己实现方法。...C++,,构造函数不能声明为虚函数,这是因为编译器构造对象时,必须知道确切类型,才能正确地生成对象;其次,构造函数执行之前,对像并不存在,无法使用指向此对像指针来调用构造函数

    1.3K10

    C++特殊类设计

    一、不能被拷贝 想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可 方式1: C++98下,私有化拷贝构造函数与赋值运算符重载并且只声明不定义 示例代码: class...,定义了其实也没有什么意义 方式二: C++11下,拷贝构造函数与赋值运算符重载函数后跟上=delete 示例代码: class NoCopy { public: NoCopy() :...& operator=(const OnlyHeap& oh); int _a; }; 解释: 私有构造函数/拷贝构造:防止别人调用拷贝栈上生成对象 提供静态创建对象函数该静态成员函数完成堆对象创建...C++98 这种方式不够直接,这里是可以继承,但是Derive不能创建对象,因为Derive构造函数必须要调用父类NonInherit构造,但是NonInherit构造函数私有了,私有子类不可见...,并且不能在.h文件定义,如果多个.cpp文件包含该头文件,那么则会报重复定义错误 效果: 优势: 实现简单 劣势: 如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊

    35220

    openFoam源码C++

    openFoam源码涉及到c++思想有很多,因为计算流体力学,域创建尤为重要,我们可以域中存储我们想要物理变量如速度、压力等等。...分析 当然,一切要从代码看起: 首先看Field基类,找到Filed.C和.H头文件开始分析: 该类都是Foam这个大命名空间底下,下面定义了很多模板类。...有这样一条规定:友元函数和运算符前向声明:如果一个模板类里调用了友元函数(外面定义方法可以使用该类里面的私有变量),而且这个友元函数里面的参数还用到了这个模板类,那么就得提前以模板方式去声明这个类和函数...这里explict解释我总结如下: C++explicit关键字只能用于修饰只有一个参数构造函数, 它作用是表明该构造函数是显示, 而非隐式, 跟它相对应 另一个关键字是implicit....C文件,我们也可以看见一些有意思写法,比如说模板构造函数,成员变量直接初始化等等: const char* const Foam::Field::typeName("Field")

    93330

    1小时入门c++面向对象编程

    缺省访问权限为私有的 公有部分:一些操作(即成员函数),是提供给用户接口功能 私有部分:一些数据成员,通常用来描述该类对象属性 2.2.4 示例 下面给出一个时间类,这个时间类中有三个成员函数...,再说明私有成员 (7)习惯将类定义说明部分或者整个定义部分 (包含实现部分) 放到一个头文件 ?...析构函数是成员函数函数体可写在类体内,也可写在类体外 析构函数名字类名前加~ 字符 析构函数不指定返回类型 析构函数没有参数 一个类只能定义一个析构函数     析构函数对象存在函数体结束时或使用...delete运算符释放new运算符创建对象时被自动调用     析构函数执行顺序与定义顺序相反,先定义对象,后调用析构函数 2.4.5缺省构造函数(默认构造函数) 类定义没有任何构造函数时,由编译器自动生成一个不带参数缺省构造函数...如果类没有说明拷贝初始化构造函数,则编译系统自动生成一个具有上述形式缺省拷贝初始化构造函数,作为该类公有成员 2.5.4 示例 ?

    1K10

    C++面试知识总结

    咋不同文件:直接引用头文件;使用extern声明变量。 2.13 变量声明和定义区别 变量声明:告诉编译器有某个类型变量,但不会为其分配内存。 变量定义:位该类变量分配内存。...该类型保证能容纳实现建立最大对象字节大小。 2.22 空指针指向了内存什么地方 标准并没有对空指针指向内存什么地方这一个问题作出规定,一般取决于系统实现。...3.5 基类和子类构造、析构顺序 定义一个对象时先调用基类构造函数、然后调用派生类构造函数 先派生类析构后基类析构,也就是说基类析构调用时候,派生类信息已经全部销毁了 3.6 深拷贝与浅拷贝区别...深拷贝意味着拷贝了资源和指针 浅拷贝只是拷贝了指针,没有拷贝资源 3.7 构造函数特点 构造函数只在建立对象时候自动被调用一次 构造函数必须是公共,否则无法生成对象 构造函数只负责为自己构造对象...  3.8 析构函数特点 函数名称固定:~类名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动调用 3.8 公有继承、私有继承、受保护继承 公有继承时,派生类对象可以访问基类公有成员

    1.7K41

    C++类设计与实现规范

    1.规范一:将类定义放在头文件实现 这样可以保证通过引入头文件时,使用是同一个类,也有利于代码维护。...有没有一劳永逸做法,其实是有的,我们将类定义放在头文件需要类源文件包含类定义所在头文件即可,保证了类定义一致性,并且修改效率高,代码易于维护。...2.规范二:尽量将数据成员申明为私有 数据成员表示了类对象状态,这些状态对外界应该是不可见设计一个类时候,如果把它数据成员访问权限设为public和protected,会带来如下影响。...所以,应该尽量将所有的数据成员申明为私有(private)。 3.规范三:将成员函数放到类外定义 类成员函数既可以放在类体内定义,也可以放在类体外定义。如果将类成员函数定义类体内,会有如下影响。...(1)类成员函数定义内部影响可读性。一般来说,类定义放在头文件,使用时被不同源文件包含,如果类成员函数定义类体内,将会是代码体积增大,影响阅读,不利于类修改与维护。

    1.2K22

    C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

    构造函数没有返回值,定义构造函数时,是不能说明它类型。 与普通成员函数一样,构造函数函数体可以写在类体内,也可写在类体外。...友元函数不是当前类成员函数,但它可以访问该类所有成员,包括私有成员、保护成员和公有成员。 声明友元函数时,需要在其函数名前加上关键字friend。...没有函数情况下,如果在派生类定义了与基类成员同名成员,则称派生类成员覆盖了基类同名成员,派生类中使用这个名字意味着访问派生类声明成员。...使用虚基类机制时应该注意以下几点: 如果在虚基类定义有带形参构造函数,并且没有定义默认形式构造函数,则整个继承结构,所有直接或间接派生类都必须在构造函数成员初始化列表列出对虚基类构造函数调用...~ 6.5 抽象类 如果一个类至少有一个纯虚函数,那么就称该类为抽象类,对于抽象类使用有以下几点规定: 由于抽象类至少包含一个没有定义功能纯虚函数

    3.3K40

    C++Primer》第七章 类

    原因有三个: 只有没有声明任何构造函数时,编译器才会自动地生成默认构造函数,一旦我们定义了一些其他构造函数,那么除非我们再定义一个默认构造函数,否则类将没有默认构造函数。...不过对于某个给定内联函数或者constexpr函数而言,它多个定义必须一致。基于这个原因,constexpr和内联函数经常被定义头文件。...这里inline成员函数基于相同原因也应该和相应定义头一个头文件。 3....const或者是引用的话必须将其初始化,当成员属于某种类型并且该类没有定义默认构造函数时,也必须将其初始化。...定义静态成员 外部定义静态成员时不可重复static关键字,该关键字只能出现在类内部声明语句 静态数据成员不属于类任何一个对象,所以它们并不是创建类对象时被定义,这意味着它们不是由类构造函数初始化

    56520

    C++】C++ 类 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    , 这个增加参数是 对象本身指针 ; Student 类 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身成员 ; 全局函数 , 实现两个 Student 类相加 , 接收两个...; } 详细代码 , 参考最后完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 类定义了有参构造函数 , 则其默认无参构造函数 , 就不会生成 ; // 带参构造函数...; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 类名 对象方式定义对象变量 ; class Student { public: // 带参构造函数...返回是一个匿名对象 , 该匿名对象 成员函数 中新创建对象 ; // 成员函数, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新

    22320

    C++设计模式-单例模式讲解

    单例模式讲解 C++,单例模式是一种常用软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。...这种模式对于管理资源、控制对共享资源访问或者创建一些中心控制类非常有用例如相关配置管理器、日志记录器、数据库连接池等。 单例模式基本特点: 私有构造函数:防止其他对象通过构造函数创建该类实例。...静态成员函数:提供一个全局访问点用于返回该类唯一实例。 静态成员变量:保存该类唯一实例。...实现步骤: 声明单例类:定义类并将其构造函数相关设置为私有,这是为了防止产生多个单例 创建静态成员变量:声明一个静态成员变量来存储唯一实例。...提供获取实例方法:定义一个静态成员函数,用于返回单例实例,也就是该单例全局访问点。 通常在需要使用该类.cpp文件引入该单例类所在头文件,并用全局访问点访问就行了 用懒汉模式还是饿汉模式?

    23630

    如何设计一个C++类?

    什么是默认构造函数?看下百度百科定义: 默认构造函数(default constructor)就是没有显式提供初始化式时调用构造函数。...它由不带参数构造函数,或者为所有的形参提供默认实参构造函数定义。如果定义某个类变量时没有提供初始化时就会使用默认构造函数。...当已经为一个类提供了带有参数构造函数,编译器不会为该类再默认生成构造函数,如果此时在其它地方以无参形式构造该类一个对象,编译器就会报错,找不到对应构造函数,那怎么解决?...一般来说类声明会写到头文件,类定义会写到源文件,但也有很多人会把定义写到头文件,我还见过有人#include "xxx.cpp"呢,这里建议,不想让函数内联,那就把定义写到源文件。...如果非内联函数头文件定义,多个源文件都引用此头文件时编译器就会报错。至于类声明写到头文件还是源文件,视情况而定,看下面这段代码,某些类声明写到了头文件,又有些类声明写到了源文件

    1.5K20

    最近好像很久没有更新过关于c++ primer 读书笔记了,一来自己最近遇到了烦心事,中断了一段时间读书。...如果一个函数概念上属于这个类,但是不定义为类成员函数,一般将这个类定义类声明头文件 访问控制与封装 一般来说定义时候应该将类数据成员定义私有或者保护类型,通过成员函数来访问类数据成员...这个类声明之后,定义之前是一个不完全类型。不完全类型可以用于定义该类指针或者引用,也可以声明以该类型作为参数或者返回该类函数。 对一个类来说,创建它对象之前必须被定义。...c++ ,内层作用域中同名成员会覆盖外层,当函数内部或者类内部定义了与全局作用域相同变量时,要使用全局作用域中变量可以使用:: 类构造函数相关 构造函数初始化列表相当于先定义再赋值,而要做到对成员变量定义同时初始化...这样就可以类内定义该类静态数据成员,而非静态数据成员只能定义该类指针或者引用 +BEGIN_SRC c++ class Menu { private: static Menu me1;

    60810
    领券