Why does this class object declaration work?

classes and objects in java example programs
class and object in c++
types of classes in java
classes and objects in java with realtime examples
classes and objects in java example programs pdf
class object python
difference between class and object
constructor in java

Suppose I have a class

class Test{
  public:
    int x;
    Test(const Test& obj){x=obj.x;}
};

Why does

Test object_name(Test random_name);

run and does not need another object as a parameter?. .Something like Test random_name(Test another_random(...)), making it a never ending way of declaring the object?

This line:

Test object_name(Test random_name);

declares a function called object_name that takes a Test as a paramter and returns a Test. It does not declare an object. It is perfectly legal to declare a function like this inside another function, it's just implicitly extern.

Class interfaces are generated from their definition, but may be made more precise through a signature, similarly to what is done for modules. Object-​Oriented  As mentioned previously, a class provides the blueprints for objects. So basically, an object is created from a class. In Java, the new keyword is used to create new objects. There are three steps when creating an object from a class − Declaration − A variable declaration with a variable name with an object type.

Substitute Test with a PoD like int and you will see what is happening

Test object_name(Test random_name); //1

int object_name(int random_name); //2

You can see that the second statement is a function declaration which takes an int as argument and returns an int.

This is due to a well-known rule in CPP related to ambiguity resolution. From the CPP working draft (N4713):

9.8 Ambiguity resolution [stmt.ambig]

1 There is an ambiguity in the grammar involving expression-statements and declarations: An expression-statement with a function-style explicit type conversion as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.

2 [ Note: If the statement cannot syntactically be a declaration, there is no ambiguity, so this rule does not apply. The whole statement might need to be examined to determine whether this is the case.

Classes and Objects are basic concepts of Object Oriented Programming which revolve In general, class declarations can include these components, in order:. C++ Classes and Objects Class: A class in C++ is the building block, that leads to Object-Oriented programming. It is a user-defined data type, which holds its own data members and member functions, which can be accessed and used by creating an instance of that class.

Here's a refactored version that should help explain what's going on. I've added another constructor to illustrate what's going on.

#include <iostream>

using namespace std;

class Test{
  public:
    int x = 27;
    Test(const int y) : x(y) { cout << "ctor-1" << endl; }
    ~Test() {}
    Test(const Test& obj) : x(obj.x) { cout << "ctor-2" << endl; }
    operator int() const { return x; }
};

int main()
{
    cout << "Creating function declaration" << endl;
    Test object_name(Test random_name);

    // This works fine
    cout << "Creating alpha" << endl;
    Test alpha(4);
    cout << "Calling `object_name`" << endl;
    cout << object_name(alpha) << endl;

    // This fails because object_name is a function.
    // cout << object_name.x << endl;
    return 0;
}

Test object_name(Test random_name)
{
    cout << "Creating another Test within `object_name`." << endl;
    return Test(random_name.x + 13);
}

Here, we see that the first constructor is invoked twice: once for alpha and again within object_name. The second constructor is invoked when we call object_name, which accepts a parameter passed by value.

Output
Creating function declaration
Creating alpha
ctor-1
Calling `object_name`
ctor-2
Creating another Test within `object_name`.
ctor-1
17

Instantiation: The new keyword is a Java operator that creates the object. When you create an object, you are creating an "instance" of a class, therefore  Object — An instance of a class. This is the realized version of the class, where the class is manifested in the program. These are used to create patterns (in the case of classes) and then make use of the patterns (in the case of objects). In this tutorial, we’ll go through creating classes, instantiating objects, initializing attributes with the constructor method, and working with more than one object of the same class.

Java - Object and Classes - Java is an Object-Oriented Language. Example: A dog has states - color, name, breed as well as behaviors – wagging the tail, barking, methods operate on the internal state of an object and the object-to-​object  A class or struct definition is like a blueprint that specifies what the type can do. An object is basically a block of memory that has been allocated and configured according to the blueprint. A program may create many objects of the same class. Objects are also called instances, and they can be stored in either a named variable or in an array

class. Each statement has the following three parts: Declaration: The code set in bold are all variable declarations that  Creating objects. Although they are sometimes used interchangeably, a class and an object are different things. A class defines a type of object, but it is not an object itself. An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

A variable declaration gives the type. A function declaration tells how to use it, without bothering with how it works. A class declaration shows what an object will​  JavaScript classes, introduced in ECMAScript 2015, are primarily syntactical sugar over JavaScript's existing prototype-based inheritance. The class syntax does not introduce a new object-oriented inheritance model to JavaScript.

Comments
  • Test object_name(Test random_name); is a function declaration, it doesn't "run".
  • OP is right, it compiles and runs on g++, even with Test object_name(Test random_name (Test another_random_name (Test new_identifier)));
  • It isn't an error. It's a valid function declaration. There's nothing wrong with it.
  • It is not an object creation, you have declared a function in int main() function
  • I'm agreeing with P.W. that this looks like a variation on the recurrent "most vexing parse" type of question…
  • My main function looks like int main() { Test Object_name(Test random_name); return 0; } I want to ask,why is this not an error?.The object in brackets should ideally require another object and this should go on.
  • Also note: the compiler accepts the declaration fine, but any attempt to use object_name make this fact obvious. Example error: "main.cpp:15:25: error: request for member ‘x’ in ‘object_name’, which is of non-class type ‘Test(Test)’".
  • @ViditVirmani: There are no objects here -- just an extern function declaration for a function that is never called. If you tried to call it, you'd get a link error, but as you've described, no error.
  • @ViditVirmani You are declaring a function in int main() function
  • I'm a fan of this answer. It very clearly shows where one's misconception may lie.