小白刷题(1)

1. C++中函数定义和调用的嵌套:

     函数的调用可以嵌套,但是函数的定义不可以嵌套。  

#include
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< }
这样定义是对的,但是如果如下定义就会出现编译错误:

#include
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< }

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. 多重继承的问题

虚基类的设置:就是为了解决多重继承导致的二义性问题。

多重继承图示:(以左边为例)

小白刷题(1)_第1张图片

多重继承定义:

一个派生类(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

void func(const int& v1, const int& v2)

{

    std::cout << v1 << ' ';

    std::cout << v2 << ' ';

}

    以下代码在vs中输出结果为____。

1

2

3

4

5

6

int main (int argc, char* argv[])

{

    int i=0;

    func(++i,i++);

    return 0;

}

       先右后左,i = 0传入,i++(后++,先取值,再++),因此第二个参数是0,此时i = 1;然后i = 1传到左边,++i(先++,再取值),因此第二个参数是2.输出 (2 0)

你可能感兴趣的:(小白刷题(1))