Documentation

This is machine translation

Translated by Microsoft
Mouse over text to see original. Click the button below to return to the English verison of the page.

Class Constructor Methods

Purpose of Class Constructor Methods

Class constructor methods create instances of the class. All MATLAB® classes have a default constructor method that returns an object of the class created with no input arguments. A class can define a constructor method that overrides the default constructor. An explicitly defined constructor can accept input arguments, initialize property values, call other methods, and perform other operations necessary to create objects of the class.

When defining a class constructor, implement support for nargin == 0 so MATLAB can call the constructor for array initialization and loading objects.

Rules for Constructors

A constructor method is a special function that creates an instance of the class. Typically, constructor methods accept input arguments to assign the data stored in properties and return an initialized object.

  • The constructor has the same name as the class.

  • The only output argument from a constructor is the object constructed.

  • The constructor can return only a single argument.

  • Constructors must always define an output argument that is a valid instance of the class. Never return an empty object from a class constructor. If you do not want to assign the output argument, you can clear the object variable in the constructor (see Output Object Not Assigned).

  • If you create a class constructor, provide a syntax to support no input arguments. See No Input Argument Constructor Requirement.

  • If the class being created is a subclass, MATLAB calls the constructor of each superclass class to initialize the object. Implicit calls to the superclass constructor are made with no arguments. If superclass constructors require arguments, call them from the subclass constructor explicitly. See Sequence of Constructor Calls in Class Hierarchy

  • If your constructor makes an explicit call to a superclass constructor, this call must occur before any other reference to the constructed object.

  • Calls to superclass constructors cannot be conditional. You cannot place superclass construction calls in loops, conditions, switches, try/catch, or nested functions. See No Conditional Calls to Superclass Constructors for more information.

  • A class does not need to define a constructor method unless it is a subclass of a superclass whose constructor requires arguments. In this case, you must explicitly call the superclass constructor with the required arguments. See Constructing Subclasses

  • If a class does not define a constructor, MATLAB supplies a constructor that takes no arguments and returns a scalar object whose properties are initialized to empty or the values specified as defaults in the property definitions. The constructor supplied by MATLAB also calls all superclass constructors with no arguments.

  • Restrict access to constructors using method attributes, as with any method.

Related Information

For information specific to constructing enumerations, see Enumeration Class Constructor Calling Sequence.

Initializing Objects in Constructor

Constructor methods must return an initialized object as the only output argument. The output argument is created when the constructor executes, before executing the first line of code.

For example, the following constructor function can assign the value of the object's property A as the first statement because the object obj has already been assigned to an instance of myClass.

function obj = myClass(a,b,c)
   obj.A = a;
      ...
end

You can call other class methods from the constructor because the object is already initialized.

The constructor also creates an object whose properties have their default values—either empty ([]) or the default value specified in the property definition block.

For example, the following code calls the class method CalculateValue to assign the value of the property Value.

function obj = myClass(a,b,c)
   obj.Value = obj.CalculateValue(a,b);
      ...
end

Referencing the Object in a Constructor

When initializing the object, for example, by assigning values to properties, use the name of the output argument to refer to the object within the constructor. For example, in the following code the output argument is obj and the object is reference as obj:

% obj is the object being constructed
function obj = myClass(arg) 
   obj.propert1 = arg*10;
   obj.method1;
      ...
end

For more information on defining default property values, see Property Default Values.

No Input Argument Constructor Requirement

There are cases where the constructor must be able to be called with no input argument:

  • When loading objects into the workspace. If the class ConstructOnLoad attribute is set to true, the load function calls the class constructor with no arguments.

  • When creating or expanding an object array such that not all elements are given specific values, the class constructor is called with no arguments to fill in unspecified elements, (for example, x(10,1) = myclass(a,b,c);). In this case, the constructor is called once with no arguments to populate the empty array elements with copies of this one object.

If there are no input arguments, the constructor creates an object using only default properties values. A good practice is to add a check for zero arguments to the class constructor to prevent an error if either of the two cases above occur:

function obj = myClass(a,b,c)
   if  nargin > 0
      obj.A = a;
      obj.B = b;
      obj.C = c;
      ...
   end
end

For ways to handle superclass constructors, see Basic Structure of Constructor Methods.

Constructing Subclasses

Subclass constructor functions must explicitly call superclass constructors if the superclass constructors require input arguments. The subclass constructor must specify these arguments in the call to the superclass constructor using the constructor output argument. Here is the syntax:

classdef MyClass < SuperClass 
   function obj = MyClass(arg)
      obj@SuperClass(ArgumentList);
         ...
   end
end

The class constructor must make all calls to superclass constructors before any other references to the object. These changes include assigning property values or calling ordinary class methods. Also, a subclass constructor can call a superclass constructor only once.

Reference Only Specified Superclasses

If the classdef does not specify the class as a superclass, the constructor cannot call a superclass constructor with this syntax .

classdef MyClass < SuperClass

MATLAB calls any uncalled constructors in the left-to-right order in which they are specified in the classdef line. MATLAB passes no arguments to these functions.

No Conditional Calls to Superclass Constructors

Calls to superclass constructors must be unconditional. There can be only one call for a given superclass. Initialize the superclass portion of the object by calling the superclass constructors before using the object (for example, to assign property values or call class methods).

If you must call superclass constructors with different arguments that depend on some condition, you can build a cell array of arguments and provide one call to the constructor.

For example, the Cube class constructor calls the superclass Shape constructor using default values when the Cube constructor is called with no arguments. If the Cube constructor is called with four input arguments, upvector and viewangle can be passed to the superclass constructor:

classdef Cube < Shape
   properties
      SideLength = 0;
      Color = [0 0 0];
   end
   methods
      function cubeObj = Cube(length,color,upvector,viewangle)
         if nargin == 0
            super_args{1} = [0 0 1];
            super_args{2} = 10;
         elseif nargin == 4
            super_args{1} = upvector;
            super_args{2} = viewangle;
         else
            error('Wrong number of input arguments')
         end
         cubeObj@Shape(super_args{:});
         if nargin > 0 % Use value if provided
            cubeObj.SideLength = length;
            cubeObj.Color = color;
         end
         ...
      end
   ...
   end
end

Zero or More Superclass Arguments

If you must support the syntax that calls the superclass constructor with no arguments, provide this syntax explicitly.

Suppose in the case of the Cube class example, all property values in the Shape superclass and the Cube subclass have default values specified in the class definitions. Then you can create an instance of Cube without specifying any arguments for the superclass or subclass constructors.

Here is how you can implement this behavior in the Cube constructor:

methods
   function cubeObj = Cube(length,color,upvector,viewangle)
      if nargin == 0 
         super_args = {};
      elseif nargin == 4
         super_args{1} = upvector;
         super_args{2} = viewangle;
      else
         error('Wrong number of input arguments')
      end
      cubeObj@Shape(super_args{:});
      if nargin > 0 
         cubeObj.SideLength = length;
         cubeObj.Color = color;
      end
   ...
   end
end

More on Subclasses

See Create Subclasses — Syntax and Techniques for information on creating subclasses.

Errors During Class Construction

If an error occurs during the construction of a handle class, the MATLAB class system calls the class destructor on the object along with the destructors for any objects contained in properties and any initialized base classes.

For information on how objects are destroyed, see Handle Class Destructor.

Basic Structure of Constructor Methods

It is important to consider the state of the object under construction when writing your constructor method. Constructor methods can be structured into three basic sections:

  • Pre-initialization — Compute arguments for superclass constructors.

  • Object initialization — Call superclass constructors.

  • Post initialization — Perform any operations related to the subclass, including referencing and assigning to the object, call class methods, passing the object to functions, and so on.

This code illustrates the basic operations performed in each section:

classdef myClass < baseClass1
   properties
      ComputedValue
   end
   methods
      function obj = myClass(a,b,c)

%%% Pre Initialization %%%
% Any code not using output argument (obj)
         if nargin == 0
         % Provide values for superclass constructor
         % and initialize other inputs 
            a = someDefaultValue;
            args{1} = someDefaultValue;
            args{2} = someDefaultValue;
         else
           % When nargin ~= 0, assign to cell array, 
           % which is passed to supclass constructor
            args{1} = b;
            args{2} = c;
         end
         compvalue = myClass.staticMethod(a);

%%% Object Initialization %%%
% Call superclass constructor before accessing object
% You cannot conditionalize this statement
         obj = obj@baseClass1(args{:});

%%% Post Initialization %%%
% Any code, including access to object
         obj.classMethod(...);
         obj.ComputedValue = compvalue;
         ...
      end
      ...
   end
   ...
end

See Construct Object Arrays for information on creating object arrays in the constructor.

Output Object Not Assigned

You can suppress the assignment of the class instance to the ans variable when no output variable is assigned in a call to the constructor. This technique is useful if you are implementing a class that defines a graphical interface.

Use nargout to determine if the constructor has been called with an output argument. For example, the class constructor for the MyApp class clears the object variable, obj, if called with no output assigned:

classdef MyApp
   methods
      function obj = MyApp
         if nargout == 0
            clear obj
         end
      end
      ...
   end
end

Related Examples

Was this topic helpful?