1. C++中函数定义和调用的嵌套:
函数的调用可以嵌套,但是函数的定义不可以嵌套。
#include<iostream.h>
int SwpInt(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
return a;
}
void main()
{
int e=12;
int f=89;
SwpInt(&e,&f);
cout<<e<<endl<<f<<endl;
}
这样定义是对的,但是如果如下定义就会出现编译错误:
#include<iostream.h>
void main()
{
int e=12;
int f=89;
int SwpInt(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
return a;
}
SwpInt(&e,&f);
cout<<e<<endl<<f<<endl;
}
error C2601: 'SwpInt' : local function definitions are illegal
2. 联合体变量
联合体(union)和结构体(struct)有相同点和不同点:
相同点:在某种程度上类似结构体的一种数据结构,同样可以包含很多种数据类型和变量。
不同点:结构体:struct中所有的变量都是“共存的”,优点是:“有容乃大”,全面。缺点是:struct的内存分配是粗放的,不管用 不用,全都分配。
联合体:union中各个变量是“互斥的”,缺点是:“不够包容”;但优点是内存使用更加精细灵活,同时也更节省内存空间
联合体(union)中的各个变量共用一个内存地址,并且各种变量名都可以同时使用,操作也是共同生效。
3. 静态的使用注意事项:
(1)静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法可以访问静态也可以访问非静态
(2)静态方法中不可以定义this,super关键字
因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this,super关键字。
(3)主函数是静态的。
程序运行的时候,静态成员已经加载在内存里面了,但是包含静态成员的对象共享这些静态成员,
比方说,A有一个静态成员public static int i;那么程序运行的时候,这个i就加载进内存了,A的所有对象的i变量都指向这个静态空间的i,也就是说创建对象之前,它就占空间了
1:只有类的成员函数才能说明为虚函数;
2:静态成员函数不能是虚函数;
3:内联函数不能为虚函数;
4:构造函数不能是虚函数;
5:析构函数可以是虚函数,而且通常声明为虚函数
4. 多重继承的问题
虚基类的设置:就是为了解决多重继承导致的二义性问题。
多重继承图示:(以左边为例)
多重继承定义:
一个派生类(D)有2个或2个以上的基类(B和C);
多重继承引起的二义性:
假如上述这些基类(B和C)具有相同的基类A,A中的成员数据和成员函数,最终都会以双份的形式拷贝到类D中,
那么调用的时候就会出现二义性问题。
虚基类:
专门用来解决多重继承引起的二义性问题;(可以理解为D直接从A继承)
虚基类的具体实现的注意细节有很多,这里不再列举了,我认为只需要了解原理即可。
尽管C++或其他OO语言支持多重继承,但在实际软件开发中多重继承用的并不多,
原因在于多重继承过手复杂。因此,在C#中已经不再支持多重继承了。
5. 位运算符--按位取反(~)
所有正整数 n 的按位取反是 -(n+1);
所有负整数 n 的按位取反是 | n+1 |;
0 的按位取反是 -1
6. C++函数参数的入栈顺序是:先右后左。
函数func的定义如下:
1 2 3 4 5 |
|
以下代码在vs中输出结果为____。
1 2 3 4 5 6 |
|
先右后左,i = 0传入,i++(后++,先取值,再++),因此第二个参数是0,此时i = 1;然后i = 1传到左边,++i(先++,再取值),因此第二个参数是2.输出 (2 0)