我知道java和我现在正在学习c ++。我比其他语言更容易学习它有很多相同的东西。我的问题是在一本书的课堂上有一个完整的构造函数,但我没有面对任何地方的默认构造函数。有c ++默认构造函数,如果是的话我应该写吗?除此之外,我想测试一些东西,在这个类上有public:
,其中有变量,经过一段时间后有{{1}而且它还有一些变量。就像java public和privates变量一样?但不是在c ++上写private:
而是写
private int numbers;
我是对的吗?
答案 0 :(得分:1)
很难确切地说出你在问什么。但: 1)如果您不自己创建任何构造函数,则会为您生成默认构造函数。它默认是公开的。 2)生成的默认构造函数将默认按声明顺序(虚拟基础(如果有),深度优先,从右到左按声明顺序构造类的基类和成员,然后从左到右声明的正常基础,那么成员变量按声明顺序排列。如果其中任何一个不能默认构造,那么就无法为你生成默认构造函数。 3)如果有const成员或引用成员,或者没有默认构造函数的成员,或者您的类具有没有默认构造函数的基础,则无法生成默认构造函数,因为必须使用一个或多个值初始化这些成员。 4)如果您定义了一个构造函数,并且您还希望编译器为您生成一个默认构造函数,并且默认构造函数在您的代码中有效,请执行以下操作:
class MyClass
{
public:
MyClass() = default; // explicitly tell compiler to generate a default
MyClass(int x) { ...} // normally would suppress gen of default ctor
};
如果我理解你关于访问说明符的问题,它们就像标签一样,跟随它们的一切都有访问规范,直到你写另一个更改它。在类中,默认情况下访问是私有的。在结构中,访问是公开的。
希望这有帮助。
答案 1 :(得分:0)
至少可以说,你的老师因不包括默认构造函数而标记出来的事实很有意思。
作为一般原则,在Java和C ++中, Constructor 负责将对象初始化为完全形成的状态。拥有默认构造函数的原因是为了在没有任何显式输入的情况下构造完全形成的对象。但这可能会变得奇怪:
//Java
public class Student {
public String name;
public int age;
public Student() {
this("", 0);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
//C++
class Student {
public: //Everything after this point has 'public' access modifier; is like putting
//'public' in front of each variable and method
std::string name;
int age;
Student() : Student("", 0) {}
Student(std::string name, int age) : name(std::move(name)), age(age) {}
};
在此示例中,Student
有一个Constructor,它使用提供的值初始化对象,以及一个Default Constructor,它将对象初始化为空名称,年龄为0。
但请想一想:是否有意义?对于有效的Student
对象没有名称,或者是否有可能构造{{1>如果你不知道他们的名字对象?暂时忘记功能需求(即,如果对象没有默认构造函数,则可能难以构造数组),在逻辑上不一致的是,可以构造一个没有像这样的输入的对象。根据您的使用情况,不具有默认构造函数可能更有意义。
因此,确定是否在代码中包含Default-Constructor是一个设计原则问题,与您是使用Java还是C ++或大多数编程语言无关。
关于您的其他问题:
Student
,public:
和protected:
有不同于Java的规则(private:
和public
大致相同,private
是奇怪的一个,Java的protected
在C ++中不存在,但可以通过使用default
关键字来模拟,但它们的行为很容易识别:
friend
在Java中,你会编写相同的代码:
class example {
//private:
//'class' declarations have everything 'private' by default, 'struct' makes things 'public' by default
int val; //is private
std::string type; //is private
public: //Will be public until another access modifier is used
example() {} //is public
example(int val, std::string type) : val(val), type(std::move(type)) {} //is public
void do_something() { //is public
private_function();
}
private: //Will be private until another access modifier is used
void private_function() { //is private
val++;
}
};