怎么获取网站数据做统计数据,如何建设废品网站,宝塔 wordpress 教程,万网网站后台管理系统说明#xff1a;
面试群#xff0c;群号#xff1a; 228447240面试题来源于网络书籍#xff0c;公司题目以及博主原创或修改#xff08;题目大部分来源于各种公司#xff09;#xff1b;文中很多题目#xff0c;或许大家直接编译器写完#xff0c;1分钟就出结果了。但…说明
面试群群号 228447240面试题来源于网络书籍公司题目以及博主原创或修改题目大部分来源于各种公司文中很多题目或许大家直接编译器写完1分钟就出结果了。但在这里博主希望每一个题目大家都要经过认真思考答案不重要重要的是通过题目理解所考知识点好应对题目更多的变化博主与大家一起学习一起刷题共同进步写文不易麻烦给个三连
前面1-15已经是C/C,但是由于前面写的比较混乱把八股文和题目混在了一起所以从这一篇开始重新整理重新写前面1-15也就可以选看了希望多多支持 1.知道C中的组合吗它与继承相比有什么优缺点吗
答案 继承 继承是i s a 的关系比如说 Student 继承 Person, 则说明 Student is a Person 。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。 继承的缺点 ①父类的内部细节对子类是可见的。 ②子类从父类继承的方法在编译时就确定下来了所以无法在运行期间改变从父类继承的方法的行 为。 ③如果对父类的方法做了修改的话比如增加了一个参数则子类的方法必须做出相应的修改。所 以说子类与父类是一种高耦合违背了面向对象思想。 组合 组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。 组合的优点 ①当前对象只能通过所包含的那个对象去调用其方法所以所包含的对象的内部细节对当前对象时不可见的。 ②当前对象与包含的对象是一个低耦合关系如果修改包含对象的类中代码不需要修改当前对象类的代码。 ③当前对象可以在运行时动态的绑定所包含的对象。可以通过 set 方法给所包含对象赋值。 组合的缺点①容易产生过多的对象。②为了能组合多个对象必须仔细对接口进行定义。 2.函数指针 答案 1) 什么是函数指针 ? 函数指针指向的是特殊的数据类型函数的类型是由其返回的数据类型和其参数列表共同决定的而函数的名称则不是其类型的一部分。 一个具体函数的名字如果后面不跟调用符号 ( 即括号 ) 则该名字就是该函数的指针 ( 注意大部分情况下可以这么认为但这种说法并不很严格) 。 2) 函数指针的声明方法 int (*pf)(const int, const int); 3) 为什么有函数指针 函数与数据项相似函数也有地址。我们希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。 4) 一个函数名就是一个指针它指向函数的代码 一个函数地址是该函数的进入点也就是调用函数的地址。函数的调用可以通过函数名也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数 5) 两种方法赋值 指针名 函数名 指针名 函数名 3.说一说你理解的内存对齐以及原因 答案 1 、 分配内存的顺序是按照声明的顺序。 2 、 每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍不是整数倍空出内存直到偏移量是整数倍为止。 3 、 最后整个结构体的大小必须是里面变量类型最大值的整数倍。 添加了 #pragma pack(n) 后规则就变成了下面这样 1 、 偏移量要是 n 和当前变量大小中较小值的整数倍 2 、 整体大小要是 n 和最大变量大小中较小值的整数倍 3 、 n 值必须为 1,2,4,8… 为其他值时就按照默认的分配规则 4.define、const、typedef、inline的使用方法他们之间有什么区别 答案 const与#define的区别 1) const 定义的常量是变量带类型而 #define 定义的只是个常数不带类型 2) define 只在预处理阶段起作用简单的文本替换而 const 在编译、链接过程中起作用 3) define 只是简单的字符串替换没有类型检查。而 const 是有数据类型的是要进行判断的可以避免一些低级错误 4) define 预处理后占用代码段空间 const 占用数据段空间 5) const 不能重定义而 define 可以通过 #undef 取消某个符号的定义进行重定义 6) define 独特功能比如可以用来防止文件重复引用。 #define和别名typedef的区别 1) 执行时间不同 typedef 在编译阶段有效 typedef 有类型检查的功能 #define 是宏定义发生在预处理阶段不进行类型检查 2) 功能差异 typedef 用来定义类型的别名定义与平台无关的数据类型与 struct 的结合使用等。 #define 不只是可以为类型取别名还可以定义常量、变量、编译开关等。 3) 作用域不同 #define 没有作用域的限制只要是之前预定义过的宏在以后的程序中都可以使用。而typedef 有自己的作用域。 define与inline的区别 1) #define 是关键字 inline 是函数 2) 宏定义在预处理阶段进行文本替换 inline 函数在编译阶段进行替换 3) inline 函数有类型检查相比宏定义比较安全 5.你知道printf函数的实现原理是什么吗 答案 在 C/C 中对函数参数的扫描是从后向前的。 C/C 的函数参数是通过压入堆栈的方式来给函数传参数的堆栈是一种先进后出的数据结构最先压入的参数最后出来在计算机的内存中数据有2 块一块是堆一块是栈函数参数及局部变量在这里而栈是从内存的高地址向低地址生长的控制生长的就是堆栈指针了最先压入的参数是在最上面就是说在所有参数的最后面最后压入的参数在最下面结构上看起来是第一个所以最后压入的参数总是能够被函数找到因为它就在堆栈指针的上方。 printf 的第一个被找到的参数就是那个字符指针就是被双引号括起来的那一部分函数通过判断字符串里控制参数的个数来判断参数个数及数据类型通过这些就可算出数据需要的堆栈指针的偏移量了下面给出printf(%d,%d,a,b); 其中 a 、 b 都是 int 型的的汇编代码。 6.cout和printf有什么区别 答案 cout 是一个函数 cout 后可以跟不同的类型是因为 cout 已存在针对各种类型数据的重载所以会自动识别数据的类型。输出过程会首先将输出字符放入缓冲区然后输出到屏幕。 cout 是有缓冲输出 : cout abc endl;
或cout abc\n ;cout flush; 这两个才是一样的. flush 立即强迫缓冲输出。 printf 是无缓冲输出。有输出时立即输出。 7.当程序中有函数重载时函数的匹配原则和顺序是什么 答案 1) 名字查找 2) 确定候选函数 3) 寻找最佳匹配 8.定义和声明的区别 答案 如果是指变量的声明和定义 从编译原理上来说声明是仅仅告诉编译器有个某类型的变量会被使用但是编译器并不会为它分配任何内存。而定义就是分配了内存。 如果是指函数的声明和定义 声明一般在头文件里对编译器说这里我有一个函数叫 function() 让编译器知道这个函数的存在。 定义一般在源文件里具体就是函数的实现过程 写明函数体。 9.隐式转换如何消除隐式转换 答案 1 、 C 的基本类型中并非完全的对立部分数据类型之间是可以进行隐式转换的。所谓隐式转换是指不需要用户干预编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换 2 、 C 面向对象的多态特性就是通过父类的类型实现对子类的封装。通过隐式转换你可以直接将一个子类的对象使用父类的类型进行返回。在比如数值和布尔类型的转换整数和浮点数的转换等。某些方面来说隐式转换给C 程序开发者带来了不小的便捷。 C 是一门强类型语言类型的检查是非常严格的。 3 、 基本数据类型 基本数据类型的转换以取值范围作为转换基础保证精度不丢失。隐式转换发生在从小- 大的转换中。比如从 char 转换为 int 。从 int-long 。自定义对象子类对象可以隐式的转换为父类对象。 4 、 C 中提供了 explicit 关键字在构造函数声明的时候加上 explicit 关键字能够禁止隐式转换。 5 、如果构造函数只接受一个参数则它实际上定义了转换为此类类型的隐式转换机制。可以通过将构造函数声明为explicit 加以制止隐式类型转换关键字 explicit 只对一个实参的构造函数有效需要多个实参的构造函数不能用于执行隐式转换所以无需将这些构造函数指定为explicit 。 10.你知道strcpy和memcpy的区别是什么吗 答案 1 、复制的内容不同。 strcpy 只能复制字符串而 memcpy 可以复制任意内容例如字符数组、整型、结构体、类等。 2 、复制的方法不同。 strcpy 不需要指定长度它遇到被复制字符的串结束符 \0 才结束所以容易溢出。memcpy 则是根据其第 3 个参数决定复制的长度。 3 、用途不同。通常在复制字符串时用 strcpy 而需要复制其他类型数据时则一般用 memcpy 11.程序在执行int main(int argc, char *argv[])时的内存结构你了解吗 答案 参数的含义是程序在命令行下运行的时候需要输入 argc 个参数每个参数是以 char 类型输入的依次存在数组里面数组是 argv[] 所有的参数在指针。 char * 指向的内存中数组的中元素的个数为 argc 个第一个参数为程序的名称。 12.如果有一个空类它会默认添加哪些函数 答案 1) Empty(); // 缺省构造函数//2) Empty( const Empty ); // 拷贝构造函数//3) ~Empty(); // 析构函数//4) Empty operator( const Empty ); // 赋值运算符//