今天看C++的书看到有一个类,类中定义了静态私有的本类对象,然后默认的构造函数是用此静态对象直接用 . 运算符访问自身成员来初始化的。成员的访问控制符是针对类而言的,而不是对象的,下面用C++验证
1.用C++验证
#include<iostream>
class Date
{
int d, m, y;
static Date default;
public:
//Date(){};
Date(int dd, int mm, int yy);
static void set_default(int, int, int);
void disply(){
std::cout << "date=" << d << " month=" << m << " year=" << y << '\n';
}
};
Date::Date(int dd=0,int mm=0,int yy=0)
{
d = dd ? dd : default.d;
m = mm ? mm : default.m;
y = yy ? yy : default.y;
}
Date Date::default;
int main(){
class Date d1;
d1.disply();
return 0;
}
正常运行,结果为
(2)作为对比,把静态成员对象和用静态对象初始化的构造函数删去,使用系统默认的构造函数,程序如下
#include<iostream>
class Date
{
int d, m, y;
public:
void disply(){
std::cout << "date=" << d << " month=" << m << " year=" << y << '\n';
}
};
int main(){
class Date d1;
d1.disply();
return 0;
}
可以看见,得到的是很奇怪的数,这是因为我们没有给d1初始化,创建d1时也不会自动地给成员赋0值。
2 java中也是适用的,用java的验证代码如下
package test;
public class SameClass {
private int a;//这个类说明类型访问时对类而言的,两个类的对象可以在成员函数中直接用.互相访问对方的私有,而不同过getClass
static SameClass s;
public SameClass(){
a=s.a;
}
public SameClass(int b){
a=b;
}
public void copy(SameClass s){
this.a=s.a;//此处没有用s.get()(也没定义get()方法),可行;若是在别的类中则不行
}
public void display(){
System.out.println(a);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SameClass s1=new SameClass(3),s2=new SameClass(2);
s2.copy(s1);
s2.display();
}
}
控制台输出3,无报错
论坛上也有相关的讨论http://bbs.csdn.net/topics/330098523