
C/C++
文章平均质量分 73
C/C++
Innovator_cjx
这个作者很懒,什么都没留下…
展开
-
C/C++遇到的笔试题
收集了在面试中遇到的C/C++笔试题,作为笔记复习一、计算 sizeof 的值void Func(char str[100]){}char str[]=”Hello”;char *p=str;int n=10;void *p1=malloc(100);请计算:sizeof(str)= 4sizeof(str)= 6sizeof( p )=4sizeof(n)=4sizeof(p1)=4二、计算下面几个类的大小class A {};: sizeof(A) = 1;clas原创 2021-08-31 14:27:32 · 438 阅读 · 0 评论 -
C++关键字 noexcept
1. 关键字noexcept从C++11开始,我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept。constexpr initializer_list() noexcept : _M_array(0), _M_len(0) { }该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出转载 2021-07-12 18:05:22 · 485 阅读 · 0 评论 -
malloc()、calloc()以及realloc()函数的区别
malloc()和calloc()函数两者都可以用来动态分配内存空间,但两者稍有区别。malloc()malloc()函数有一个参数,即要分配的内存空间的大小,函数声明(函数原型):void *malloc(unsigned int num_bytes);说明:malloc向系统申请分配指定size个字节的内存空间。返回类型是 void*类型。void*表示未确定类型的指针。C,C++规定,void*类型可以强制转换为任何其它类型的指针。从函数声明上可以看出。malloc和new至少有两个不同转载 2021-06-26 22:11:44 · 332 阅读 · 0 评论 -
C++ 类之间的关系与实现
类与类的关系在面向对象的程序设计中,类之间有6中关系,分别是继承, 组合, 聚合,关联, 依赖,实现,如果使用C语言实现,上面的这些关系通过"结构体包含结构体、结构体包含结构体指针以及函数指针等语法实现",C语言本身的语法并不支持这些逻辑关系的实现,所以使用C语言实现面向对象的程序设计很多时候需要我们自己来关注某一种语法实现两个类之间到底是什么关系,但是C++/Java/Python等语言原生支持面向对象的程序设计,即这些编程语言的语法本身就可以实现这些类之间的逻辑关系,本文以C++为例,分析这些类关系的转载 2021-06-26 17:06:57 · 1411 阅读 · 2 评论 -
const对象不能调用非const成员函数
在C++中,可以用const来定义一个const对象,但const对象不可以调用类中的非const成员函数原因引发原因:: 由调用成员函数时隐式传入的当前对象的this指针引起。非const成员函数中的隐式参数:classA* thisconst成员函数中的隐式参数:const classA* this根本原因:const对象的指针为const classA* this,因此传入非const成员函数时编译器报错(类型不匹配,无法从const 指针转换为非const指针);但传入const成转载 2021-05-07 20:44:01 · 2920 阅读 · 0 评论 -
C语言extern关键字
在函数内定义的变量是局部变量,而在函数之外定义的变量则称为外部变量,外部变量也称全局变量。它的存储方式为静态存储,其生存周期为整个程序的生存周期。全局变量可以为本文件中的其他函数所共用,它的有效范围为从定义变量的位置开始到本源文件结束。然而,如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部转载 2021-05-07 15:25:18 · 181 阅读 · 0 评论 -
const在不同位置下的修饰作用
顶层const与底层constconst int* a:这里的const修饰的是int,而int定义的是一个整型值a。因此*a所指向的对象值不能通过*a来修改。但是可以重新给a赋值,使其指向不同的对象int* const a:这里的const修饰的是a,a代表的是一个指针地址。因此不能赋值给a其他的地址值,但可以修改a指向的值,如*a = 1const int* a与int const* a两者等价const int* const a:a所指向的对象的值以及地址a本身的值都不能被修改总结co原创 2021-05-07 10:45:55 · 238 阅读 · 0 评论 -
C++ 中作用域受限的枚举类型
本文介绍 C++ 中传统枚举类型存在的作用域不受限等问题,随后列举经典的限定其作用域的做法,最后给出新标准 C++11 下的解决方案。传统行为传统的枚举类型在 C 语言中就有,C++ 中行为和 C 中一致,常被用来定义有类型的常量。一个典型的枚举类型定义如下:enum Color { RED, BLUE };C++ 发明人 Bjarne Stroustrup 总结这种枚举有如下问题:作用域不受限 (unscoped),枚举变量的作用域不受限,会暴露给领近的代码作用域(如果在最外层则为全局作用域转载 2021-04-01 11:08:49 · 1624 阅读 · 0 评论 -
构建 C/C++ 项目时添加宏定义
有时候我们希望在构建时能够在命令行添加一些宏定义,改变程序行为。一个典型应用示例是代码里通过检查是否定义了 DEBUG 宏,来决定是否输出调试信息。编译器一般提供命令行选项支持这种做法,例如使用 gcc 时可以在命令行添加-D选项,定义一些宏:gcc -DDEBUG=1 a.c不过,大型项目一般都需要自动化构建工具,如 GNU Autotools 或者 CMake。使用它们后,我们无法直接修改编译命令,但它们提供了替代方案。对于 Autotools,它可以识别 CPPFLAGS等环境变量,从而我们可以转载 2021-04-01 10:25:55 · 2675 阅读 · 0 评论 -
C++成员变量的初始化顺序问题详解
问题来源:《剑指offer》中,考官出了一道简单的程序输出结果值的题,如下:class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; } }; int main() { A a; a.Pri转载 2021-03-31 23:04:10 · 456 阅读 · 0 评论