美文网首页
C++(二)

C++(二)

作者: Wlopsg | 来源:发表于2019-02-27 16:38 被阅读0次

    1、虚继承

    https://www.nowcoder.com/test/question/done?tid=21293634&qid=36517#summary

    2、建立类模板的对象时,首先需要将类模板实例化,即向模板传递参数完成类模板的实例化,然后在定义该类的对象。模板函数只有在使用时候才会进行实例化。

    3、宏只是预定义的函数,在编译阶段不进行类型安全性检查,在编译的时候将对应函数用宏命令替换。对程序性能无影响。

    4、宏与类型无关,但是 c++ 中函数必须指定返回类型,故宏可以做函数不能做的事

    5、无符号号整数和有符号整数相加,有符号整数转化为无符号整数

    6、assert 含义是断言,它是标准 C++ 的 cassert 头文件中定义的一个宏,用来判断一个条件表达式的值是否为 ture, 如果不为 true, 程序会终止,并且报告出错误,这样就很容易将错误定位 

    通常我们开发的程序有 2 种模式:Debug 模式和 Release 模式

    1. 在 Debug 模式下,编译器会记录很多调试信息,也可以加入很多测试代码,比如加入断言 assert, 方便我们程序员测试,以及出现 bug 时的分析解决

    2. Release 模式下,就没有上述那些调试信息,而且编译器也会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题,就不方便分析测试了

    7、fork函数 https://coolshell.cn/articles/7965.html

    8、for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来

    9、

    1、栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。

    2、堆区(heap) — 一般由程序员分配释放, new, malloc 之类的,若程序员不释放,程序结束时可能由 OS 回收 。

    3、全局区(静态区)(static)— 存放全局变量、静态数据、常量。程序结束后由系统释放。

    4、文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放。

    5、程序代码区 — 存放函数体(类成员函数和全局函数)的二进制代码。

    ////////////////////////////////////////

    a,全局变量,全局区;

    b,成员变量,堆区;(我是这样理解的,因为对象要申请,会放在堆区,所以类的成员也就是放在堆区)

    c,静态变量,静态区;

    d,方法变量,栈区;

    p,方法变量,栈区,指向堆区的对象。

    10、函数有返回值的话就可以作为实参传给另外一个函数的形参用

    11、c 语言中的宏是完全文本的替换。add(a+b)和 a+b 中,在程序运算中后者代替了前者。也就是说 5*add (3+4) 就是 5*3+4,答案就是 19。

    12、一、静态成员的特点:

    (1)static 数据成员在类的内部声明,但只能在类的外部定义,在类的外部不能指定 static,在类的定义时候进行初始化;

    (2)static 数据成员只能在类的外部进行初始化(特例:当整型 const static 数据成员被常量表达式初始化时,就可以在类的内部进行初始化,但还需要在外部进行定义)。

    (3) static 数据成员可以是该成员所属的类类型,而非 static 数据成员只能自身类的引用或者指针。

    (4)static 数据成员可以用作类成员函数的默认实参。

    (5)static 数据成员的值可以改变。

    二、静态成员和非静态成员的区别:

    (1) 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类和对象都可以进行访问;

    (2)不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象访问;

    (3) 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。

    (4) 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。

    三、静态成员函数的特点:

    (1) static 成员函数没有 this 形参,它可以访问所属类的 static 成员,但不能访问非 static 成员。

    (2)static 成员函数既可以在类的内部定义,也可以在类的外部定义,在外部定义时,不能重复指定 static 保留字。

    (3)static 成员函数不能声明为虚函数,不能实现动态绑定

    (4)static 成员函数不能声明为 const,因为 const 是针对 this 是不是 const 而言的

    (5)构造函数、析构函数不能为静态函数。

    13、

    vector 是顺序存储的,只有在尾部插入才不会导致迭代器失效,在头部插入或者中间插入都会导致插入的部位以及其后的所有迭代器都失效;

    map 是映射,key 和 value 是一一对应的,在内存中是零散存在的,迭代器通过 key 找到 value,无论怎么插入都不会让迭代器失效,当然删除只会使得被删除元素的迭代器失效

    14、null 为一个宏 (void*) 0, 故可以理解为 '\0' 不存在 '\' 字符,只有 '\\'

    15、已经定义过的全局变量 假如用引用头文件的方式引用,假如有两个 cpp 以上引用这个头文件就会出现重复定义,用 extern 引用 只是声明,不会分配内存,不会重复定义,所以用 extern。

    16、const 用来说明所定义的变量是只读的。 这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用

    17、数组名 a 可以作为数组的首地址,&a 表示一个指向大小为 5 数组的指针,那么 & a+1 就是表示一个指向大小为 5 的下一个数组的指针

    18、引用数据类型是引用传递(call by reference),基本数据类型是值传递(call by value)

    值传递不可以改变原变量的内容和地址 ---》原因是 java 方法的形参传递都是传递原变量的副本,在方法中改变的是副本的值,而不适合原变量的

    引用传递不可以改变原变量的地址,但可以改变原变量的内容 ---》原因是当副本的引用改变时,原变量 的引用并没有发生变化,当副本改变内容时,由于副本引用指向的是原变量的地址空间,所以,原变量的内容发生变化。

    19、运算符重载时要遵循以下规则:

    (1) 除了类属关系运算符 "."、成员指针运算符 ".*"、作用域运算符 "::"、sizeof 运算符和三目运算符 "?:" 以外,C++ 中的所有运算符都可以重载。

    (2) 重载运算符限制在 C++ 语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

    (3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

    (4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

    (5) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

    (6) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

    20、究极指针 https://www.nowcoder.com/test/question/done?tid=21306637&qid=112251#summary

    相关文章

      网友评论

          本文标题:C++(二)

          本文链接:https://www.haomeiwen.com/subject/ytwzyqtx.html