我的站点

一个系统软件工程师的随手涂鸦

Tag: C-plus-plus (Page 1 of 4)

C++要点笔记(26)——构造函数(constructor)

构造函数(constructor)和类(class)名字相同,但要注意构造函数没有返回值(void也不行):

class A {
public:
    A();
private:
    int member;
};

A::A()
{
    member = 3;
}  

如果没有提供构造函数,C++会自动生成一个不带参数的默认构造函数(即default constructordefault constructor可以是没有参数或所有参数都有默认值) ,这个默认构造函数会调用类成员的默认构造函数初始化所有成员,但不会初始化primitive typecharint等等)。一旦提供了一个构造函数,C++就不会提供默认的不带参数的构造函数了,这点一定要注意。

可以用initialization list方式初始化类的成员:

class A {
public:
    A();
    void Output();
private:
    int member;
    int haha;
};

A::A():member(3), haha(8)
{
}

只能使用initialization list初始化的成员:

(1)constreference(可以参考SO上的这篇帖子):

Capture 当程序执行进入constructor代码时,整个object应该已经初始化完成了。 执行initialization list时,整个object还没有完全初始化完成。 因此constreference只能在initialization list中进行“初始化”,而不能在constructor中进行“赋值”。

C++要点笔记(25)——默认模板类型参数

C++支持“默认模板类型参数”,即不为模板提供类型参数时,则使用这个默认的参数。举例如下:

template <typename T = ProcessBase>
struct PID 
{
    ......
}

参考资料:
what’s the purpose of typename assignment inside templates

 

C++要点笔记(24)——类的静态成员

C++类中的静态数据成员(static data member)只是声明(declaration),不是定义(definition),需要在类定义外显示地进行定义。这样做是避免定义类的头文件被多个文件包含后,引起编译问题:

class A {
public:
    static int a;
};

int A::a;

除了静态数据成员(static data member),还有静态成员函数(static member function)。它们的共同点是属于整个类,而不属于类的某一个实例,可以通过“类名::成员”方式来访问。需要注意的是,由于静态成员函数没有指向实例的this指针,所以它只能访问类的静态数据成员,而不能访问每个实例的成员。

参考资料:
Static Data Member Initialization
Static data members in C++

 

Mesos笔记 (9)—— Containerizer类代码解析

Containerizer类(定义在src/slave/containerizer/containerizer.hpp )是所有Containerizer的抽象父类。除了默认的构造函数和一个什么都没做的析构函数,其只实现了createresources方法。create方法代码如下(v0.26版本):

Try<Containerizer*> Containerizer::create(
    const Flags& flags,
    bool local,
    Fetcher* fetcher)
{
  if (flags.isolation == "external") {
    LOG(WARNING) << "The 'external' isolation flag is deprecated, "
                 << "please update your flags to"
                 << " '--containerizers=external'.";

    Try<ExternalContainerizer*> containerizer =
      ExternalContainerizer::create(flags);
    if (containerizer.isError()) {
      return Error("Could not create ExternalContainerizer: " +
                   containerizer.error());
    }

    return containerizer.get();
  }

  // TODO(benh): We need to store which containerizer or
  // containerizers were being used. See MESOS-1663.

  // Create containerizer(s).
  vector<Containerizer*> containerizers;

  foreach (const string& type, strings::split(flags.containerizers, ",")) {
    if (type == "mesos") {
      Try<MesosContainerizer*> containerizer =
        MesosContainerizer::create(flags, local, fetcher);
      if (containerizer.isError()) {
        return Error("Could not create MesosContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else if (type == "docker") {
      Try<DockerContainerizer*> containerizer =
        DockerContainerizer::create(flags, fetcher);
      if (containerizer.isError()) {
        return Error("Could not create DockerContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else if (type == "external") {
      Try<ExternalContainerizer*> containerizer =
        ExternalContainerizer::create(flags);
      if (containerizer.isError()) {
        return Error("Could not create ExternalContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else {
      return Error("Unknown or unsupported containerizer: " + type);
    }
  }

  if (containerizers.size() == 1) {
    return containerizers.front();
  }

  Try<ComposingContainerizer*> containerizer =
    ComposingContainerizer::create(containerizers);

  if (containerizer.isError()) {
    return Error(containerizer.error());
  }

  return containerizer.get();
}

默认情况下,containerizerstypemesos,所以会调用MesosContainerizer::create来生成containerizer。关于resources方法,参考Mesos笔记 (5)—— 资源

 

C++要点笔记(23)——static_cast,reinterpret_cast,const_cast和dynamic_cast

Quora上一篇帖子对这几种cast做了很好的解释。总结一下:

1 2

C++要点笔记(22)——多态(Polymorphism)

下面是对Polymorphism的解释:

Polymorphism means “many forms”. It is where one type of thing comes in many forms. So you can treat it according to its type, but it will behave differently according to which form of that type it happens to be.

Polymorphism含义为一个类型有多种形式:这些形式虽属于同一类型,但是具体的行为不同。

Polymorphism stems from inheritance. The whole idea is that you have a general base class and more specific derived classes. You can then write code that works with the base class… and polymorphims makes your code not only work with the base class, but all derived classes.

Polymorphism源于继承,它可以让代码对基类和衍生类都能工作。

One of the features of derived classes is that a pointer to a derived class is type-compatible with a pointer to its base class. Polymorphism takes advantage of this feature.

Polymorphism利用了衍生类的指针与基类指针兼容的特性。

A class that declares or inherits a virtual function is called a polymorphic class.

Polymorphism class是定义或继承了virtual functionclass

Pure virtual function定义:

virtual void f() = 0;

包含pure virtual function定义的类是abstract class

参考资料:
I don’t understand Polymorphism at all?
C++ polymorphism and abstract base class

 

C++要点笔记(21)——引用(reference)

Reference可以看做是一个变量的别名:

int x;
int& foo = x;

Reference的一个重要用途是用在函数传参中:

int workWithClass( const MyClass& a_class_object )
{
}

在上述函数中,因为参数是引用,所以省去了copy参数的工作;并且由于有const修饰,所以不会对参数所指向的对象进行修改。

参考资料:
C++ References

 

C++要点笔记(20)——内联方法(inline method)

下文摘自C++ Primer Plus

123

C++要点笔记(19)——内联函数(inline function)

下文摘自C++ Primer Plus

Capture

C++要点笔记(18)——类(class)包含哪些部分

下文摘自C++ Primer Plus

Capture

Page 1 of 4

Powered by WordPress & Theme by Anders Norén