zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

c++该怎么学习(面试吃土记)

2023-03-15 21:59:58 时间

当时场景

对话:

旁白:工作3-5年,去面试 c++

面试官:你对c++比较了解吗?

小王:对的

旁白:自信满满

面试官:咱们来几个c++题目

  • 打印输出结果?
#include <stdio.h>
#define MIN__TEST(a,b) ((a)<=(b)?(a):(b))
int main()
{
    int arry[5] = {10,20,30,40,50};
    int *p = &arry[0];
    //printf("1=%d
",*p);
   //printf("2=%d
",*p++);

    //printf("MIN = %d, *p = %d
", MIN__TEST(*p++, 10), *p);
    return 0;

}
  • 打印输出结果:
float a = 1.0f;
std::cout << (int)a << std::endl; //1
std::cout << (int&)a << std::endl;//????/
std::cout << std::boolalpha << ( (int)a == (int&)a ) << std::endl;

小王:。。。

旁白:内心崩溃

知识点1 :#define 宏的优缺点

宏并不是函数,宏并不是语句,宏并不是类型定义

宏并不是函数,宏并不是语句,宏并不是类型定义

宏并不是函数,宏并不是语句,宏并不是类型定义

对话:

老王建议:看看宏与 const 与 内敛函数区别?

小王提问:宏与const 不同东西,怎么有区别呢,对题目产生疑问?

旁白:一片汪洋大海,那是哪呀

老王:

  • 宏可以修饰常量 const修饰常量 相同点。 #define Pi 3.1415926 const double =3.1415926;(编译时候,只读操作const做替换)
  • 宏代替函数,内敛函数也是函数 相同点,那相同点呢?

#define MIN__TEST(a,b) ((a)<=(b)?(a):(b))

提示:变量和表达式有什么区别?

小王:

  • 预处理命令:不直接编译,不作类型检查,做一些不符合c++语法 替换工作 (优点)
  • 提高程序的运行效率(优点,避免函数调用)
  • 宏不会检查错误,const会检查错误(缺点)

宏:判断2个数字大小 错误场景 (缺点:表达式作为参数)

一次循环i=1,变成i=3.和期望不符合

观察:

  • 上面是一个函数,循环遍历 ,然后通过宏max比较大小
  • i++,写在宏里面导致,i做2次++,从1变成3.(旁白:错误了) bigest =max(2>2?2:3)
  • 如何写出正确宏

答案:20 30 想想这是为什么

#include <stdio.h>
#define MIN__TEST(a,b) ((a)<=(b)?(a):(b))
int main()
{
    int arry[5] = {10,20,30,40,50};
    int *p = &arry[0];
    //printf("1=%d
",*p);
   //printf("2=%d
",*p++);
   
    //printf("MIN = %d, *p = %d
", MIN__TEST(*p++, 10), *p);
    return 0;
    
}
wan

考点2:虚拟内存地址与指针类型

指针是C语言的灵魂。想要学好指针,我们就要先从内存地址学起。

内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据

  • 小王提问:

内存地址不就是一串十六进制表示的数字么(其实底层都是二进制),哪来的什么类型一说呢, 为什么又需要类型呢?

尝试回答:

#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{ 

float a = 1.0f;
std::cout << (int)a << std::endl; //1
std::cout << (int&)a << std::endl;//1065353216
std::cout << std::boolalpha << ( (int)a == (int&)a ) << std::endl;  //false

float b = 0.0f;
std::cout << (int)b << std::endl; //0
std::cout << (int&)b << std::endl; //0
std::cout << std::boolalpha << ( (int)b == (int& )b ) << std::endl;//true 
   
return 0;

}
   

1地址

0地址

库的:链接与加载。

探究C++类成员函数的编译次序

  • C语言函数编译次序:从上到下依次编译,当遇到在函数内部使用的其他函数名字时,将会在此函数之前查找,若有函数声明或者定义则编译成功,反之编译失败。
  • C++类中成员函数编译次序:1.首先编译成员的声明。2.直到类全部可见后才编译函数体。

C语言函数编译次序

C++类中成员函数编译次序:

一次完成

2次完成

全局符号和本地符号

staic修饰是local

  1. 小王疑问:静态局部变量和普通全局变量以及静态全局变量的区别?https://www.zhihu.com/question/37029880
  • C++ 可重定位目标模块(即. o 文件)中有个符号表,包含本模块所有定义和引用的符号信息。符号又分为全局符号和本地符号两种。
  • 全局符号指本模块定义的非静态函数和全局变量,其他模块可见,可以供其他模块使用。
  • 本地符号指静态函数和静态变量,只能供本模块使用,其他模块不可见。使用 readelf 命令可以查看一个符号是本地还是全局。

都存储在数据段, 全局变量、静态局部变量、静态全局变量都在静态存储区分配空间

但是范围不一样。

  1. 符号冲突怎么办?

冲突怎么办?