首页 >> 大全

继承派生析构多态与花式计算的顺序

2023-11-22 大全 26 作者:考证青年

变量声明语句中位于被声明的变量左边时,作为引用,等价于我把右侧的东西引用为这个名字

int i;
int &ri = i;//表示建立一个int型的引用ri,并将其初始化为变量i的一个别名

“ & ”从执行角度

右侧的时候,我要拿取这个对象的地址,或者是这个变量存放的地址

int a,b;
int *pa,*pb;
pa = &a;//表示pa中存储的地址是a的地址

融合

注:一个数组可以用它的名称来直接表示它的初始地址。数组名称实际上就是一个指针常量。例:

int a[10];//一维* ,二维** 或者 * a[],关于维度的操作
int *ptr = a;//用数组的首地址初始化int型指针,只是首地址,不是全部交接
/* int *ptr;
ptr = a; */  //同样也是用数组的首地址初始化int型指针

注:①可以声明为指向常量的指针,此时不能通过通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。(如果在函数体中不需要通过指针改变指针所指向的内容,可以将其声明为指向常量的指针)例:

int a;
const int *p1 = &a ; //p1是指向常量的指针
int b;
p1 = &b ;//正确,p1本身的值可以改变,将其改为指向另一个对象
*p1 = 1//错误,不能通过p1这个指针改变其所指向的对象

②可以声明为指针类型的常量,这是指针本身的值不能被改变。(意思就是始终指向同一个地址)例:

int* const p2 = &a;
p2 = &b;//错误,p2是指针常量,值不能改变,始终指向a的地址

③一般情况下,指针的值只能赋给相同类型的指针。但是void类型的指针,可以存储任何类型的对象地址,经过使用类型显式转换,通过void类型的指针就可以访问任何类型的数据。

参数执行

#include
using namespace std;
int sub(int x, int& y, int* z) {int t = y;y = x > y ? x : y;if (y < *z)y = *z;x = x + t + *z;*z = x / 3;return x;
}
int main()
{int a = 10, b = 5, c = 22, * pa = &c;int s = sub(a, b, pa);cout << s << " " << a << " " << b << " " << c << endl;return 0;
}

答案是 37 10 22 12

分析,(pa获取c地址)后加*也就是取值为22;

继承与派生构造函数__继承与派生的过程

sub函数要的是a的值,y的地址上值,操作更改会进行覆盖,而pa地址上的值。进行操作

y的值给了t,先进行x>y就取大,此时y 的值变成了10;y x=x自身10+t5+z22=37;

z在计算变换后为37/3=12;

返回了x=37;

s就是37,a还是原来的10没有任何变化,b因为&同步变化是22,c就是pa地址上的值是函数里的z是12;

静态 全局 外接

c语言中,用来说明静态变量。

如果是在函数外面定义的,那么其效果和全局变量类似,即说明的变量可以在当前c程序文件中使用。如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,我们再次调用该函数时,仍是保存的上一次函数调用时保存的结果。当全局变量与局部变量重名的时候,起作用的是局部变量,全局变量被屏蔽掉。在函数外对全局变量声明,使全局变量的作用域从声明处到文件的结束。 bool计算 a && b,当a为假时,整个逻辑表达式的结果必为假,评估表达式b的值是不必要的。同样的情况也发生在表达式c || d中,当c为真时,d的真假不影响整个表达式的值。在上述情形下,编译器会略过表达式b和d的运算,这种行为就好比电路“短路”时,电流总是沿阻抗最低的“近路”行进,称之为“布尔运算的短路”。常见

(1)既无成功匹配,又无子句,那么语句块什么也不做;

(2)无成功匹配,但有,那么语句块做语句块的事;

(3)有成功匹配,没有break,那么成功匹配后,一直执行,直到遇到break。

全局静态

静态构造函数在一个类中只能有一个,且只能被执行一次,而实例构造函数则无此限制。即在加载类的时候执行静态构造函数,而在创建实例时执行实例构造函数。

public class AddClass
{public static int a { get; }/// /// 静态构造函数会在属性a被调用之前执行,用于初始化静态属性a/// static AddClass(){a = 10;}
}

静态构造函数的作用是初始化类的静态字段和静态属性,且在类的任何实例创建之前和静态成员被引用之前。

这是由于CLR不能确保在明确时间点执行静态构造函数,同时也不能预计不同类的静态构造函数执行顺序,所以,只能确定静态构造函数会在第一次调用类的其他成员之前被调用。

静态构造函数只会被CLR调用,不能显示调用,所以静态构造函数不会有访问修饰符和参数;静态构造函数也不能访问类的实例成员。

析构

析构函数只对类的实例起作用,因此没有静态析构函数,只有直接的析构函数命名

实例构造函数 在创建类的每个实例时都会调用

静态构造函数 只调用一次,在类的任意静态变量第一次被访问之前或者类的任何实例被创建之前,没有的话就跳过

class MyClass {int x;
public:MyClass(int a) {x = a;cout << "construction" << x << endl;}~MyClass() {cout << "Destruct" << x << endl;}
};
MyClass globlabody(9);
int main() {MyClass commonobity(0);static MyClass staticnbody(1);return 0;
}
//
construction9
construction0
construction1
Destruct0
Destruct1
Destruct9

namespace ConsoleApp1{class A{static A(){Console.WriteLine("1");}public A() {Console.WriteLine("2");}}class B : A{static B() {Console.WriteLine("a");}public B(){Console.WriteLine("b");}}class Program {static void Main(string[] args) {//a 1 2 bA ab = new B();Console.WriteLine("--------");//2 bab = new B();Console.ReadKey();}}
}

A ab = new B();

A. 实例化B, 执行B的静态构造函数 == 输出a

B. 执行B的构造函数,因为B继承自A,所以先进入A

C. 实例化A, 执行A的静态构造函数,== 输出 1

D. 执行A的构造函数 ==输出2

E. 最后回到B的构造函数 == 输出b

2、ab = new B();

因为静态构造函数只创建一次,所以不会进入静态构造函数

A. 因为B继承自A,所以先进入A的构造函数 == 输出2

B. 再进入B的构造函数 == 输出b

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了