一、C++类
class Test
{
private:
int sum;
protected:
int value;
public:
int num;
}
int main()
{
num=10;
}
这个程序是不对的。
因为这只是一个类型,没有实例化对象。我们只能访问的是对象,而不是类型,只能给对象空间 。虽然他是公有的,但也不可以进行访问。
下面这个程序是正确的吗?
class Int
{
private:
int value;
public:
Int(int x=0):vlaue(x)
{
cout<<"creat Int:"<<value <<this<<endl;
}
~Int()
{
cout<<"destroy Int:"<<value <<this<<endl;
}
void SetValue(int x=0):value(x){}
int GetValue(){return value;}
};
int main()
{
Int a(10);
a.SetValue(100);
cout<<a.GetValue()<<endl;
}
是不对的。
只有构造函数,拷贝构造函数可以用冒号进行初始化,普通函数是不可以的。
为什么不可以使用冒号?
在构造函数和拷贝构造函数中的冒号代表初始化,但在对象的其他成员函数不能再二次构建。
在下面的代码中,x是如何对a进行赋值的呢?
int main()
{
Int a=10;
int x=100;
a=x;
a.Print();
return 0;
}
构造函数有一个作用是类型转换。在直接进行a=x的话是行不通的,这时会调用构造函数创造一个不具名的对象,把x的值给不具名对象,再用不具名对象给a赋值。
拷贝构造函数是按位拷贝。
这个函数打印的是多少
class Int
{
private:
int value;
public:
Int(int x,int y=0):value(x+y)
{
cout<<"creat Int(int,int)"<<value<<" "<<this<<endl;
}
};
int main()
{
Int a(1,2);
int x=10,y=20;
a=(x,y);
a.Print();
}
打印的是20.这里是逗号表达式,取后面的值,因为y已经有初始值了,所以会将y的值赋给x,所以打印出来就是20.
但是如果这样写
class Int
{
private:
int value;
public:
Int(int x,int y=0):value(x+y)
{
cout<<"creat Int(int,int)"<<value<<" "<<this<<endl;
}
};
int main()
{
Int a(1,2);
int x=10,y=20;
a=(Int)(x,y);
a.Print();
a=Int(x,y);
a.Print();
}
这里类型强转必须是单参,但是构建不具名对象不要求必须是单参。