1. 联合体union
一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。
- 默认访问控制符为 public
- 可以含有构造函数、析构函数
- 不能含有引用类型的成员
- 不能继承自其他类,不能作为基类
- 不能含有虚函数
- 匿名 union 在定义所在作用域可直接访问 union 成员
- 匿名 union 不能包含 protected 成员或 private 成员
- 全局匿名联合必须是静态(static)的
2. 全局变量global和静态变量static区别
全局变量和静态变量在内存中存放在同一位置,即静态区/全局区。
从作用域来看:
静态变量的生命周期为整个源程序,其作用域仍与普通变量相同
静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量
从生命周期看:
都在程序运行时期全程有效
全局变量:用extern声明,也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。作用域是整个源程序。如果全局变量和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全局变量。
静态变量:用static声明,从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用static。
3. main函数的参数argc,argv是什么意思
argc 是 argument count的缩写,表示传入main函数的参数个数;
argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径;
4. 类的静态成员函数访问非静态成员变量的方法:
#include<iostream>
using namespace std;
class A
{
public:
A(int x):m_x(x){};
static void f(A a);
private:
int m_x;
};
void A::f(A a)
{
//静态成员函数只能引用属于该类的静态数据成员或静态成员函数。
// cout<<m_x<<endl; //对x的引用是错误的
cout<<a.m_x<<endl; //正确
}
int main(int argc, char const *argv[])
{
A a(5);
a.f(a);
// system("pause");
return 0;
}
5. 类前向声明的意义:解决类间相互包含的问题
6. const
- 函数后面加const是表明这个函数不会更改class的状态,即class内各成员变量的值。编译器如果发现某个const函数里改变了成员变量的值会报错。
- const定义的对象必须进行初始化,而且不能被更新。 常引用:被引用的对象不能被更新。 const 类型说明符 &引用名 常对象(对象的数据成员不能被改变):必须进行初始化,不能被更新。 类名 const 对象名 常数组:数组元素不能被更新。 类型说明符 const 数组名[大小]... 常指针:指向常量的指针。
- 通过常对象只能调用它的常成员函数,普通对象调用普通成员函数
7. 基类和派生类
把派生类对象赋值给基类对象。 把派生类对象的地址赋值给基类指针。 用派生类对象初始化基类对象的引用。 反之则不行,即不能把基类对象赋值给派生类对象;不能把基类对象的地址赋值给派生类对象的指针;也不能把基类对象作为派生对象的引用。
派生类只能采用构造函数初始化列表的方式向基类或成员对象的构造函数传递参数,
派生类对象的构造
- 先构造基类
- 再构造成员
- 最后构造自身(调用构造函数)