1. No const constructor

Unlike other member functions, constructors may not be declared as const . When we create a const object of a class type, the object does not assume its “constness” until after the constructor completes the object’s initialization. Thus, constructors can write to const objects during their construction


2. Synthesized default constructor

The compiler-generated compiler is known as synthesized default constructor

For most classes, the synthesized default constructor initializes each data member as follows: if there is an in-class initializer, use it to initialize the member; otherwise, default initialize the member.

3.Why sometimes should difine default constructor for classes?

A reason to define default constructor is that for some classes, the synthesized default constructor does the wrong thing. The objects of built-in or compound type(such as array and pointer) that are defined inside a block have undefined value when they are default initialized. Therefore, classes that have members of built-in or compound type should either be initialized inside the class or define their own version of default constructor.

Another reason that some classes must define their own default constructor is that sometimes the compiler is unable to synthesize one. For example, if a class has a member of a class type, and that class doesn't have a default constructor , then the compiler can't initializer that member.

P.S. Classes that have members of built-in or compound type rely on synthesized default constructor only if all such members have in-class initializer.

4. Constructor initializer list

Constructor initializer list specifies initial values for one or more data members of the object being created.

5. Difference of default access level between class and struct

The default access specifier in strcut is public whereas that in class is private.

P.S. The only difference using class and using strcut to define a class is the default access level.

6. friend class or function

A class can allow other class or function to access its non-public members by making the class or function a friend.

P.S. Friend declaration should be inside a class definition and they may be anywhere in the class. Friends are not members of the class and aren't affected by the access specifier.

7. Benefits of encapsulation

1) User code can't inadvertently corrupt the state of an encapsyulated object

2) The user-level code doesn't need change when the implementation of can encapsulated class changes.

8. Friend class

The member functions of a friend class can access all the members, including non-public members of the class granting friendship.

P.S. Classes and non-member functions need not have been declared before they are used in a friend declaration.

9. What's name lookup?

Name lookup is the process of which declaration matches the use of a name.

10. Name lookup process

First look for a declaration of a name in the block where the name is used. Only name declared before is considered. Then if the name isn't found, look in the enclosing scope(s). If no declaration is found, then the program is in error.

11. Class definition are processed in two phases:

First, the member declarations are compiled. Function bodies are compiled only after the entire class has been seen.

12. Normal block-scope name lookup inside member functions

A name used in a body of member function is resolved as follows:

First, look for the declaration of the name inside the function body. As usual, only declarations in the part preceding the use of the name should be considered.

Then if no declaration is found inside the member function, look up declarations inside class. All the members of the class should be considered.

If no declaration is found inside the class, look for declarations in the scope that before the member function definition.

13. Constructor initializers are sometimes required(constructor initializer vs. assignment in constructor)

Members that are const or reference must be initialized. Similarly, members of a class type that doesn't have a default constructor must be initialized.

14. Order of member initialization

Members are initialized in the order that they appear in the class definition. The order in which the initializer appears in the constructor initializer list doesn't change the order of initialization.

P.S. It's a good idea write constructor initializer in the same order as the members are declared. Moreover, when possible, avoid using members to initialize other members.

15. Constructor and default arguments

A constructor that supplies default arguments for all its parameters also defines the default constructor.

16. Delegating constructor(C++11 feature)

A delegating constructor use another constructor from its class to perform its initialization.

17. We must initialize the static data member outside the class body.

18. Static data members vs. ordinary data members

1) Static data members can have incomplete data type. In particular, a static data member can have the same type as the class of which it is a member. A non-static member is restricted to a pointer or reference.

2) We can use a static member as a default argument.

随机推荐

  1. gcc常用命令介绍

    GCC 全称是 GNU C Compiler,是gnu中最流行的c & c++编译器,下面我们看一下一些主要的参数使用方法. 对于一个源文件可以直接生成可执行文件 gcc test.c 默认生 ...

  2. ADO.NET笔记——执行事务

    相关知识: 处于同一事务(Transaction)内的一组操作,要么都成功执行,最后完全提交:但如果只要有任何一个操作失败或者出问题,所有值钱执行的操作也都取消并恢复到初始状态(即回滚) SqlTra ...

  3. Git错误non-fast-forward后的冲突解决(转载)

    文章转载自:http://blog.csdn.net/chain2012/article/details/7476493 当要push代码到git时,出现提示: error:failed to pus ...

  4. 简单的jQuery获取URL的?后带的参数

    var con_name = getQueryString("con_name"); //接收con_name        function getQueryString(val ...

  5. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  6. 浅析IList与List的区别

    List和IList是.net开发中经常遇到的两种类型,用法上经常会让初学者摸不到头脑,下面简要的分析一下这两种类型的区别 1.IList<T>是接口,继承自ICollection< ...

  7. 初级jQuery的使用

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. Oracle之存储过程

    1.存储过程创建 oracle中创建存储过程的语法如下: CREATE [OR REPLACE] PROCEDURE PRO_NAME[(parameter1[,parameter2]...)]is| ...

  9. C# 时间戳

    C# 时间与时间戳互转 13位 /// <summary> /// 将c# DateTime时间格式转换为Unix时间戳格式 /// </summary> /// <pa ...

  10. 【iis错误码】IIS 服务 这些年遇到的错误码

      II 发生错误,客户端似乎有问题.例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息. 400 - 错误的请求. 401 - 访问被拒绝.   -- 暴力添加everyone用户,  i ...