1.友元类、B类中有A类对象初始化
class A {
friend class B;//友元类
private:
int a;
public:
A(int a):a(a){}
};
class B {
private:
A a2;
public:
B(int b):a2(b) {}//调用A的构造函数,B(int b) {a2(b)}是错的
void print() {
cout << a2.a << endl;
}
};
int main() {
B test(20);
test.print();
}
2.默认参数赋值
void test(int a, int b = 10, char c = '*') {
cout << a << " " << b << " " << c << endl;
}
int main() {
test(1);
test(1, 2);
test(1, 'a');//不合法,结果:1,97(a),*
test(1, 2, 'a');
}
从左到右,依次赋值
3.在保护派生中,基类权限为Private的成员在派生类中会被继承吗?
class A1 {
private:
int a;
public:
int b;
};
class A2 :protected A1 {};
int main() {
cout << sizeof(A1) << " " << sizeof(A2) << endl;
}
通过代码可以发现,private也会被继承,只不过不能被子类访问。
4.用指针定义一个一维数组
int* p = new int[10]{ 1,2,3,4,5 };
int* p1 = new int[10];
5.定义一个数组,能否对数组名++或–?
假定变量b和pb定义为“int b[10], *pb=b;”,要将24赋值给b[1]元素中
int b[10], * pb = b;
*(pb + 1) = 10;
*(b + 1) = 10; //可以执行
*++b = 10;//不能执行,数组名不能进行自增、自减,否则数组会发生变化!!
*++pb = 10;
++b,本质为b=b+1,会对数组进行破坏。
不行,如果对数组名进行自增、自减,会改变整个数组指向。
6.只能使用成员函数重载的运算符
只能使用成员函数重载的运算符有:=、()、[]、->
只能使用成员函数重载是为了防止出现: 1 = x, 1[x], 1->x, 1(x)这样的合法语句
7.类模板和模板类、函数模板和模板函数
记法:类模板(是个模板)——>模板类(是个类)
8.局部变量和全局变量访问
int a = 10;//全局变量
void isLeapYear() {
//如果全局变量和局部变量重名,在局部变量作用域中,优先使用局部变量,
//若要使用全局变量,需要加::
int a = 11;//局部变量
cout << a << endl;//访问局部
cout << ::a << endl;//访问全局
}
9.结构体变量传递(结构体中含有指针)
虽然加了const 和 &,但也只是指针地址不能改变,但是指针地址对应的值可以变。
struct MyStruct
{
int* a;
};
void modify(const MyStruct& s) {
int arr = 2;
//s.a = &arr;//非法
*(s.a) = 2;//实际上修改的是地址对应的值,所以还是会改变
}
int main() {
MyStruct s;
int a = 1;
s.a = &a;
cout << *(s.a) << endl;
modify(s);
cout << *(s.a) << endl;
}