关于一个类的构造函数要注意以下几点:
- 当一个类没有任何构造函数时,编译器会自动生成一个默认构造函数,此时可以
classtype variable;
,但类有其他构造函数时,编译器不会生成默认构造函数,因此如果没有自定义,以上实例化是错误的 - 两个构造函数需要执行同一段代码时,可以考虑用overlapping constructor 和delegating constructor;
- 当数据成员有const成员时,只能用成员列表赋值,在函数体采用copy initialization是错误的
double value2(2.2); // direct initialization
char value3 {'c'} // uniform initialization
- 构造函数之间可以相互调用(不能显性调用),但是只能采用参数列表方式。构造函数不能被成员函数调用。但构造函数可以调用成员函数,成员函数应该放在函数体内。
关于assert()函数:
#include <stdio.h> /* printf */
#include <assert.h> /* assert */
void print_number(int* myInt) {
assert(("this is not to be null",myInt != NULL));
//或者assert(myInt != NULl && "this is not to be null"),这两个语句将输出字面语
//或者不显示语句assert(myInt != NULL)
printf("%d\n", *myInt);
}
int main()
{
int a = 10;
int * b = NULL;
int * c = NULL;
b = &a;
print_number(b);
print_number(c);
return 0;
}
析构函数
析构函数可以调用其他成员函数,没什么好说的;;;
scope , duration, linkage.
关于linkage,一个文件的非const全局变量默认为extern的
global.cpp
int g_x; // non-const globals have external linkage by default
int g_y(2); // non-const globals have external linkage by default
// in this file, g_x and g_y can be used anywhere beyond this point```
main.cpp
extern int g_x; // forward declaration for g_x -- g_x can be used beyond this point in this file
int main()
{
extern int g_y; // forward declaration for g_y -- g_y can be used beyond this point in main()
g_x = 5;
std::cout << g_y; // should print 2
return 0;
}```
一个文件const全局变量默认static的constants.cpp:
namespace Constants
{
// actual global variables
extern const double pi(3.14159);
extern const double avogadro(6.0221413e23);
extern const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
}
constants.h:
#ifndef CONSTANTS_H
#define CONSTANTS_H
namespace Constants
{
// forward declarations only
extern const double pi;
extern const double avogadro;
extern const double my_gravity;
}
#endif
Use in the code file stays the same:
#include "constants.h"
double circumference = 2 * radius * Constants::pi;
这个实现cpp不需要包含.h文件?????
静态成员函数
- 静态成员函数只能调用静态数据,不能调用非静态数据
- 静态成员函数没有this指针
- 可以通过类名加::进行调用
- 在类里面定义为内联函数,在类外定义则不是
静态成员数据
- 静态成员数据在 类里声明,在类外定义初始化
- 当static const int i = 1;为静态const数据时在内里面初始化(不过这种数据应该没什么用处吧)
- 在没有实例化的情况下,也可以通过::进行访问
网友评论