C C++最全C++初学者应该注意的问题(1),2024年最新淘汰了80%的C C++面试者

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

3)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址.

4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位.

5)一定要记住 二进制 如何划成 十进制。

概念常考到的:  1)编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。  2)每个C语言程序中main函数是有且只有一个。

3)在函数中不可以再定义函数。

4)算法的是一定要有输出的,他可以没有输入。

5)break可用于循环结构和switch语句。

6)逗号运算符的级别最低。

1)合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。

关键字不可以作为用户标识符号。

main define scanf printf 都不是关键字。

迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

2)字符数据的合法形式:  ‘1’ 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。  ‘0’ 的ASCII数值表示为48,‘a’ 的ASCII数值是97,'A’的ASCII数值是65。

3) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:  考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。

4)强制类型转换:  一定是 (int)a 不是 int(a),注意类型上一定有括号的。  注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。

5)转义字符的考查:  在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。  在程序中 int a = 06d, 是一个八进制的形式。  在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。  ‘\141’ 是合法的, 0是不能写的。  ‘\108’是非法的,因为不可以出现8。

容易犯的错误

变量

内置类型

1、在C++中,类型的定义基本和C语言的相同,只是有一些不同。在C++中,根据C++ Primer中所讲,main()函数的返回类型必须是int型。这个没有亲自验证过,或者说曾经遇到但是没有注意。估计使用不同的编译器结果是不一样的吧,有些编译器会对C++的标准进行扩展。而且空格符不允许出现在预处理指示中。

2、在内置类型中遇到的第一个问题是bool类型到底占了多大的存储空间。这个是C++标准未定义的,编译器可以根据自己的想法规定bool类型所占据的存储空间。

3、C++中有一种类型叫wchar_t,叫宽字符。是对char类型的扩展,占有两个字节的存储空间。宽字符字符串表示为L"hello world".其中,连接字符串字面值和宽字符串字面值,其结果是未定义的,这样的程序可能会执行,崩溃或者产生没有用的值,在不同的编译器下程序的结果可能会不同。

4、C++中初始化有两种方法:一种是直接初始化,如int val(1024);另一种是复制初始化,如int val=1024.

5、extern关键字表示声明变量而不是定义变量。只有当extern声明位于函数外部时,才可以含有初始化式。

6、局部变量可以屏蔽全局变量,而不是平常认为的重复定义,只有在同一个作用域中的同名定义变量才会被编译器认为是重复定义。

7、非const变量定义在全局作用域中,如果做了合适的声明,就可以在另外的文件中使用。即,在全局作用域定义非const变量时,它可以在整个程序中访问,方法是在一个文件中定义,在另一个文件中用extern声明即可。而全局的const变量是定义该对象的文件的局部变量,中存在于那个文件中。不能被其他文件访问,若指定其为extern就可以全部访问了。这个在C++ primer中我感觉是一句废话。其根源是非const变量默认是extern的。const类型在定义时必须初始化。

8、引用必须用与该引用同类型的对象初始化。const引用时指向const对象的引用。非const引用只能绑定到与该引用同类型的对象;const引用则可以绑定到不同但相关的类型的对象或绑定到右值。如:

double dval=3.14;

const int &ri=dval;

编译器会默认将其转换为:

int temp=dval;

const int &ri=temp;

9、若ri为非const,则修改ri只是改变了temp,而为改变dval.所以仅允许const引用绑定到需要临时使用的值是完全必要的。头文件中可以定义类,值在编译时就可以知道的const对象和inline函数。当const对象是由常量表达式初始化时,要放在头文件中;相反,要放在源文件中,并在其它文件中添加extern.

标准库类型

1、迭代器iterator中,vector对象ivec.end(); 返回的是末端元素的下一个地址。

2、使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来修改其指向的元素的值,可以对迭代器进行自增一级使用解引用来读取值,但不能对该元素进行赋值。

3、const iterator只能用它来改写指向的元素,不能使它指向其他元素,且必须进行初始化。

4、任何改变vector长度的操作都会使已存在的迭代器失效。

数组和指针

1、在函数体外定义的数组,其元素均初始化为0;在函数体内定义的内置类型的数组,其元素无初始化。不管数组定义在哪里,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化。数组是不允许直接复制和赋值的。

2、指针和引用的区别:①引用总是指向某个对象,定义引用时没有初始化是错误的。②给引用赋值时改变的是引用所关联的对象的值,而不是使引用与另一个对象关联。

3、不允许一个非const对象指针指向一个const对象。允许吧非const对象地址赋值给一个指向const对象的指针。

4、指向const对象的指针: const int p;.const 指针:int const p; //定义时必须初始化

5、释放动态申请的数组时要用delete[] p;不能只是delete p;这样会造成内存泄露。

6、typedef:

typedef String pstring;

const pstring cstr;==String const pstring;

因为const形容的是cstr,所以要放在它们中间。

表达式

1、求模的操作数只能为整数类型,如bool,char,short,int,long.如果两个数都是负数,求模的结果为负数或者零,如果一正一负,则结果视机器或编译器而定。

2、在一个表达式里,不要在两个或更多的子表达式中对同一个对象做自增或自减操作。这样的行为时未定义的。

3、对于包含signed和unsigned型的表达式,signed型会被转换为unsigned型。

4、如果逗号操作符最右边的操作数是左值,则逗号表达式的值也是左值。

函数

1、指针形参:若函数的形参是指向非const类型的指针,则传递的实参只能是指向非const类型的指针;若函数形参是指向const类型的指针,则传递指向const和非const类型的指针都可以。原因是:可以将指向const对象的指针初始化为指向非const对象,但不可以让指向非const对象的指针指向const对象。

2、引用形参:如果函数有非const引用形参,则不能通过const对象进行调用。

3、在调用函数时,如果该函数使用非引用的非const形参,则既可以给函数传递const实参,也可以给函数传递非const的实参。原因是在C语言中,具有const形参或非const形参并无区别,都是实参的副本,这里主要是与C语言兼容。原因:实参传递时复制传递,可以用const对象初始化非const对象,反之亦然。

4、通过引用传递数组,编译器会检查数组实参大小与形参大小是否匹配。若直接传递数组,编译器只是传递了指向数组第一个元素的指针,并不进行数组大小的匹配。如:

void func(int (&arr)[10]);

传递多维数组方法:

void func(int (arr)[10]);

//或者

void func(int arr[][10]);

5、如果一个函数的形参具有默认实参,那么,它后面所有的形参都必须具有默认实参。要给一个带默认实参的形参提供实参,那么也必须给它前面的带默认实参的形参提供实参。在一个文件中,只能为一个形参指定默认实参一次,一般在声明中指定默认实参。若在定义中的形参表中指定默认实参,那么只有在包含该函数定义的源文件中调用该函数是,默认实参才有效,所以说,默认实参一般要定义在头文件中。

6、编译器隐式的将在类内定义的成员函数当做内联函数。

7、类中成员函数形参表后面的const表明this是指向const对象的指针,不能修改调用该函数的对象,这种函数叫const成员函数。

8、关于函数指针:

//①表示cmpFcn是一种指向函数的指针类型名字。

Typedef bool (cmpFcn)(const string&,const string&);

//② 函数指针不存在类型转换。

//③ 调用函数指针的方法如:

//函数声明为

bool lengthCompare(const String&,const String&);

cmpFcn pf=lengthcompare;

lengthCompare(“hi”,“bye”);//函数名直接调用

pf(“hi”,“bye”);//函数指针调用

(pf) (“hi”,“bye”);//函数解引用调用

//④函数指针型的形参:

void useBigger(bool(const String&,const String&));

void useBigger(bool()(const String&,const String&));

标准IO库

1、IO对象不可复制或赋值。由于流对象不能复制,随意不能存在vector容器中。形参或返回类型不能为流对象。必须传递或返回IO对象的指针或者引用。引用必须是非const类型的。

1、const成员不能改变其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只在定义或者声明中出现一处,就会出现编译错误。

2、不能从const成员函数返回指向类对象的普通引用,const成员只能返回this作为一个const引用。

3、显式指定inline成员时,可以在类内声明时写inline,也可在类外写inline,但是只能二者选一。

4、因为类可以向前声明,即只是声明,如:class A;却不定义类的成员,所以该类不能创建对象。但是可以定义该类的指针或者引用。这样便可以定义一个class A{ public:A next;};类似C语言中链表所表示的结构一样。

5、使用类的方法有两种:一种为A temp;另一种为class A temp;.这是为了和C语言的结构体兼容。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值