c++

protected 和 private修饰的构造函数:

1.在类的外部创建对象时,不能调用protected或private修饰的构造函数。

2.当子类中的构造函数调用父类的private构造函数时会错,当子类中的构造函数调用父类中的 public或protected构造函数时是对的。

#include <iostream>
using namespace std; ////////////////////////////////////////////////
class A {
public:
A();
protected:
A(int x);
private:
A(int x, int y);
};
A::A() {
cout<<"A::A() public"<<endl;
}
A::A(int x) {
cout<<"A(int x) protected"<<endl;
}
A::A(int x, int y) {
cout<<"A(int x,int y) private"<<endl;
}
////////////////////////////////////////////////
class B:public A {
public:
B();
B(int x);
//B(int x , int y);
void show();
};
B::B(): A() {//public A() }
B::B(int x): A(x) {//子类中的构造函数可调用父类的protected构造函数 } //当子类中的构造函数调用父类的private构造函数时会错
// error C2248: “A::A”: 无法访问 private 成员(在“A”类中声明)
// B::B(int x, int y): A(x,y){
//
// } ////////////////////////////////////////////////
void f1()
{
A a1; // A::A() public
// A a2(1); //error:在类的外部创建对象时,不能调用protected或private修饰的构造函数。
// A a3(1,2); //error:在类的外部创建对象时,不能调用protected或private修饰的构造函数。
B b1(); // A(int x) protected
} int main()
{
f1(); while();
return ;
}

那么,private构造函数怎么才能被用到呢?

两种方法:

1、使用友元类的对象中的方法来创建它。

2、在本类中实现static方法来创建它。

#include <iostream>
using namespace std;
#include <string> //友元创建:
class pri_class
{
friend class pub_class;
private:
pri_class();
};
pri_class::pri_class()
{
cout<<"a new pri_class is created"<<endl;
}
class pub_class
{
public:
pri_class* create_pri_class()
{
return new pri_class;
}
}; //static 创建:
class pri_class_2
{
public:
static pri_class_2* NewInstance(string h );
pri_class_2();
private:
pri_class_2(string h);
}; pri_class_2::pri_class_2()
{
cout<<"a new pri_class_2 is created"<<endl;
} pri_class_2* pri_class_2::NewInstance(string h)
{
cout<<h<<"I am going to create a new pri_class_2!" <<endl;
return new pri_class_2;
} //----------------------------------------------------------------------
void func(void)
{
pub_class fire;
pri_class *pri_ptr = fire.create_pri_class();//a new pri_class is created pri_class_2 pri2;//a new pri_class_2 is created
string str("coco");
pri2.NewInstance(str); //coco ,I am going to create a new pri_class_2!   //a new pri_class_2 is created
}
int main()
{
func(); while();
return ;
}
 

补充:

构造函数定义为private,protected http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html

c++ ,protected 和 private修饰的构造函数的更多相关文章

  1. Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性

    Java修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...

  2. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  3. java 修饰符的作用一(public protected default private 组)

    1.public protected default private 组 public 权限最大,同类,同包,不同包,同包子类父类之间,不同包子类父类之间都可以访问. java 默认的权限是defau ...

  4. java四种权限修饰符(public > protected > (default) > private)

    权限修饰符在哪里可以访问 (default) : 表示什么权限修饰符都不写 位置 public protected (default) private 同一个类 yes yes yes yes 同一个 ...

  5. 【java基础】(1)Java的权限修饰符(public,protected,default,private)

    访问权限修饰符权限从高到低排列是public  ,protected  ,default, private. 一.根据“是否是同包”.“是否是子类”分为4中情况+本类 5种情况 二.把 同包中的子类 ...

  6. private/默认/protected/public权限修饰符的区别

    private/默认/protected/public权限修饰符和面向对象的三大特性的封装性有着密切关系.它们都可以修饰类的成员,其中的默认和public还可以修饰类. 类的成员包括:成员变量.成员方 ...

  7. Java/C++之 public、protected、private ; virtual & abstract

    一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类 ...

  8. 对c++ public、protected、private关键字的理解

    首先要明确一下: 1.这三个关键字在两种地方会用到,一个是对类的成员变量和成员函数修饰时(比如私有的成员变量,受保护的成员变量·,公有的函数),还有一种是对继承方式的修饰(比如公有继承,保护继承). ...

  9. 【PHP面向对象(OOP)编程入门教程】13.访问类型(public,protected,private)

    类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却是OOP语言的一个好的特性.而且大多数OOP语言都已支持此特性.PHP5支持如下3种访问修饰符: public (公有的. ...

随机推荐

  1. [LeetCode]题解(python):070-Climbing Stairs

    题目来源: https://leetcode.com/problems/climbing-stairs/ 题意分析: 爬楼梯,一次可以爬一步或者两步.如果要爬n层,问一共有多少种爬法.比如说,如果是3 ...

  2. [转] IOS中AppDelegate中的生命周期事件的调用条件

    IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...

  3. 捕捉小括号获取的内容保存在RegExp的$1 $2..属性中

    ~~~~捕捉小括号获取的内容保存在RegExp的$1 $2..属性中 var reg=/^(-?\d+)(px|pt|em|in)?$/;if(reg.test(svalue)){           ...

  4. MySQL DBA成长之路

    http://blog.51cto.com/zt/579 :GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'm ...

  5. 【LeetCode】Path Sum 2 --java 二叉数 深度遍历,保存路径

    在Path SUm 1中(http://www.cnblogs.com/hitkb/p/4242822.html) 我们采用栈的形式保存路径,每当找到符合的叶子节点,就将栈内元素输出.注意存在多条路径 ...

  6. Flex疑难小杂症

    本文主要解决Flex中一些小问题,收集一些小技巧(来自网络及个人经验) flex自动换行问题  有时候由于label .button等控件中需要用到text属性显示出文本,文本太长就涉及到换行问题,解 ...

  7. Kapit控件方法笔记

    r.kapit.visualizer.renderers.DefaultItemRenderer //整个节点添加click处理函数对象类型 fr.kapit.visualizer.controls. ...

  8. Extending your SharePoint 2007 site with Microsoft ASP.NET AJAX 3.5

    After ASP.NET 3.5 has been installed you need to modify the web.config file of your MOSS web site wi ...

  9. Delete website with command.

    1.AppCmd.exe 2.http://www.windowsnetworking.com/articles-tutorials/windows-server-2008/Configuring-I ...

  10. CSS样式属性

    一.背景与前景 1.背景: 2.前景字体: (二)边界和边框 border(表格边框.样式等).margin(表外间距).padding(内容与单元格间距). margin(外边距)对自身不会有变化, ...