,但不能被模块外其他函数访问 在模块内的 static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。...起到了隐藏的作用 在类的 static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static...- int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。...char a[] = “hello”; a[0] = ‘X’; char *p = “world”; // 注意p 指向常量字符串,指向的是常量区 p[0] = ‘X’; // 编译器不能发现该错误,运行时错误...,每次用到这个变量的值的时候都要去重新读取这个变量的值,而不是读寄存器内的备份。
然而,void是“空类型”,什么是空类型呢,你可以理解成不知道存储空间大小的类型。既然编译器无法确定void类型的变量的存储大小,那么它自然不让你声明这样的变量。...为什么呢?问得好,我将尽全力对此作出解释:其实指针也是变量,只不过这个变量很特殊,它是存放其他变量的地址的变量。...通过特性3和特性4,我们看到了数组和指针有着千丝万缕的关系,这些关系也是导致程序潜在错误的一大因素,关于指针与数组的关系问题我将在《C/C++刁钻问题各个击破之指针与数组的秘密》一文中进行详细介绍。...那为什么sizeof(arrayB)又可以得到arraryB的大小呢?...这个是为什么呢?我一时半会想不到,所以还请朋友们补充! 特性8:sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
4.空类的大小 虽然这个类是空的,但是还可以创建对象不是吗?...,然而你又通过指针去访问空对象中的数据,那就是典型的空指针访问,this->_a,读取访问权限冲突 } private: int _a; }; int main() { B* p = nullptr...; p->PrintB(); return 0; } 我将答案写到了代码注释里面,想要解决上面的题目,其实要明白空指针的成员访问,空指针马,那就是什么都没有,它里面是空的,所以无论你是对空指针进行成员访问或是解引用...编译阶段,语法检查不会报错 运行起来会发生错误。 五、类的六个默认成员函数 我们上面提到过类型占一个字节的空类,空类中什么都没有吗?还是他有但是我们看不到?...const成员的讲解,看完自然就可以理解,这里的函数为什么设计成这个样子。
AOT 指的是传统的编译行为,在静态类型语言(如 C、C++、Rust)和某些动态类型语言(如 Go、Swift)中得到了广泛应用,由于能提前看到完整代码,编译器/语言运行时可以在编译阶段进行充分的优化...比如在 v8 里,js 堆指针和 SMI 小整数类型(small intergers)是通过 Tagged Pointer 来表达和引用的,区别就在于最低一位是不是 0 来决定其指针类型: 对象指针(32...({}) 和 %DebugPrint(123) 来看看其指针数值是不是整数,然后你会发现所有对象的指针数值都是奇数 Tagged Pointer ( 实际上 heap 内的都是奇数 heapdump 里也能看到这个细节...1. assumption 被打破的时候不会 crash / 硬件错误 / 段错误吗?...的 in-object properties 访问了,这也是这个技术为什么叫做 Inline Cahce (ICs) 了。
空类的大小 在 C++ 中规定类的大小不为 0,空类大小为 1,当类不包含虚函数和非静态成员时,其对象大小也为 1。若存在虚函数,则需要存储一个虚函数指针大小,在 32 位上为 4 字节。.../* (TYPE*)0 将零转型成 TYPE 类型指针 ((TYPE*)0->MEMBER) 访问结构体中的成员 &((TYPE*)0->MEMBER) 取出数据成员地址,也就是相对于零的偏移量 (size_t...define 只是简单的替换功能,没有类型检查功能,const 有类型检查功能,可以避免一些错误。 define 在预编译阶段就替换掉了,无法调试,const 可以通过集成化工具调试。..."重定义" 错误,可以通过 #ifndef 来避免这个错误。...如果子类对象赋值给父类变量,则使用该变量只能访问子类的父类部分。 如果反过来,这个子类变量如果去访问它的扩充成员变量,就会访问不到,造成内存越界。
在模板内的static函数只可被这一模块内的其他函数调用,这个函数的适用范围被限制在声明他的模板内 在类中static成员变量属于整个类所拥有,对象的所有对象只有一份复制 在类中static成员函数属于整个类所拥有...,这个函数不接收this指针,因而只能访问类的static成员变量 引用和指针有什么区别?...C语言没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,在运行过程中可能会内存访问错误。 指针非法访问。...指针保存了一个非法的地址,通过这样的指针访问所指向的地址时会产生内存访问错误。 什么函数不能声明为虚函数? (1)不能被继承的函数。 (2)不能被重写的函数。...内联成员函数:内联函数是在编译时展开的,而虚函数是为了实现多态,是在运行时绑定的。因此内联函数和多态的特性相违背。 静态成员函数:首先静态成员函数理论是可继承的。
答:为了对用户自定义数据类型的数据的操作与内定义的数据类型的数据的操作形式一致。 18. 不允许重载的5个运算符是哪些? 答: 1. .*(成员指针访问运算符号) 2....C++中类型为private的成员变量可以由哪些函数访问? 只可以由本类中的成员函数和友员函数访问 48....而sum_b 一直是0 (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内...; (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; (5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量...ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。
2) 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 3) 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;...4) 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5) 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量...6) const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员; 7) 非const成员函数可以访问非const对象的非const...这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。...() 不用奇怪为什么空指针也可以调用函数,因为这在编译期就确定了,和指针空不空没关系; return 0; } 如果将A类中的virtual注释去掉,则运行结果是: pa->func();
某一天逻辑调整,我们通过某种计算(比如解析配置)获得了一个 vector类型的变量 v,如果v里面有元素就取第一个元素赋值给s,否则还沿用默认值"1234567"。...二叉树的层序遍历: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。...,是因为最外层的while循环判断条件是一直判断 q是否为空,然而每一层遍历的q 其实是不同的。...来处理,在每一层遍历完成后,再从vector里把下一层的节点push到已经变成空的队列q中。...这个指针本身是栈存储,它指向的位置是堆存储区。所谓的swap,只不过是交换两个容器内部指向数据的指针。
33 C++中类成员的访问权限 C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。...在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员 34 什么是右值引用,跟左值又有什么区别?...C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。 37 C++的空类有哪些成员函数 缺省构造函数。 缺省拷贝构造函数。 省析构函数。 赋值运算符。...) 「dynamic_cast」 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针,包括向上转换...48 用两个栈实现一个队列的功能 typedef struct node { int data; node *next; }node,*LinkStack; //创建空栈: LinkStack
动态类型语言,就是类型的检查是在运行时做的,是不是合法的要到运行时才判断,例如JavaScript就没有编译错误,只有运行错误。...在运行时判断任意一个类所具有的成员变量和方法。 在运行时调用任意一个对象的方法。...当然Class类内不止这三个,还封装了很多,我们常用的就这三个。 RunTime运行时阶段:创建对象的过程new。...关于为什么要使用private访问权限的构造器,使用这个构造器不就不能外部访问了嘛,不也就无法进行实例化对象了吗?...目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你! 如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文! 感谢大家的阅读!?
对象的本质就是一堆的属性(成员变量)和一系列的方法(成员函数)组成,在讲这个之前,先补充说明一个「函数指针」。...(上面这段说法实际很不准确,因为编译器不会分配内存,编译好的代码也是以二进制的形式放在磁盘上,只有程序开始运行时才会加载到内存) 如果我们把函数的首地址也存储在某个指针变量里,就可以通过这个指针变量来调用所指向的函数了...只有这样,当你在成员函数内访问成员变量的时候,编译器才知道你访问的是哪一个对象。 诶,别忙,按照这样说,那岂不是,如果我在成员函数内不访问任何成员变量,就不需要传递这个this指针?...成员变量, 那么就会导致运行时程序发生 coredump,因为我们访问了一个 NULL 地址,或者说是基于 NULL 偏移一定位置的地址,这段空间绝对是没有访问权限的。...这个问题解释就和上面的一样,但是这个结论不能推广到其它语言,比如 Java、Python,这些语言的虚拟机一般会做一些额外的检查,比如判断调用对象是否是空指针等,是的话就会触发空指针异常。
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...由于 p 是一个空指针,正常来说试图通过空指针调用函数会导致运行时错误,但是本题并没有对指针进行解引用调用,而是直接使用cout函数,所以会正常运行。 // 1.下面程序编译运行结果是?...由于 p 是一个空指针,试图通过空指针调用函数会导致运行时错误,本题是对p指针解引用调用_a,所以会出现运行崩溃(即this->_a) 什么时候会出现编译报错 编译报错通常在编程过程中出现,以下是一些常见的情况...在C++中,this指针指向当前对象的地址,如果对象不存在,即为空,this指针也将为空。在访问对象的成员函数时,需要先判断this指针是否为空,以避免访问空指针错误。...这个问题的具体示例在上述的题目,我们给this传入了一个空指针,我们不对this指针进行解引用,程序是正常运行的,我们一旦解引用程序便会报错。
它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。 此处的方法指针表是通过运行时反射能力构建的。...类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。...T 的值,ok 会是 true;否则 v 是类型 T 的零值,ok 是 false,也没有运行时错误发生。...TODO:The compiler rejects assertions guaranteed to fail,类型断言总是在运行时才执行,因此它会产生运行时错误。...这个转换是在运行时进行检查的,转换失败会导致一个运行时错误:这是 Go 语言动态的一面,可以拿它和 Ruby 和 Python 这些动态语言相比较。
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 一个被声明为静态的变量可以被模块内所用函数访问,但不能被其他文件函数访问。它是一个本地的全局变量。 3)....在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,这个函数被限制在声明它的模块的本地范围内使用。...对于静态成员函数,只能访问静态成员函数和静态成员变量,不能访问非静态成员函数或者变量。...extern:引用其他文件的函数或变量 2、内存泄漏: 申请内存后要删除,new和delete的使用 确保您不是在访问空指针 malloc和free一起使用 fwrite和write区别: fwrite...但仍可使用指向抽象类的指针支持运行时多态性。
本P主要的知识点有:【缺省函数】【命名空间域】【函数重载】【引用】【C++中的NULL与空指针区别】【内联函数】【类】【This指针】【const成员/成员函数】【static静态成员 】【explicit...(指针/别名) 五.C++中的NULL与空指针区别 在C++中,NULL表示“ 0 ”,实际是一个宏。 在C++中要表示 空指针,使用 nullptr。 图示: 六....类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 静态成员函数没有隐藏的this指针,不能访问任何非静态成员 静态成员也是类的成员,受public、protected、private...yes 四.static的应用:“求1+2+3+...n的和" 步骤: 将成员变为静态成员变量 利用访问操作符与静态成员函数GetRet()得到_ret(和) 图示: 五.static应用:...友元分为:友元函数和友元类 通俗而言:友元函数的声明表达了友元函数能够访问这个类的权限,相当于客人(友元)函数拥有主人家的钥匙(友元声明),可以随便进出主人家里,偷吃主人家里的饼干(访问私有域成员
在C中,通过结构体时,可以用 b.a 来访问结构体成员;通过结构体指针时,可以用 b->a 访问结构体中同一成员。对于指针,试图用 b.a 访问则是语法错误。...通过结构体访问成员,与通过指针访问结构体成员等同对待,非常符合逻辑啊。...我们通过一个 nil 指针调用了方法!这是什么情况? 键入值类型,而非对象。 这就是我为什么用引号的“对象”。Go保存的结构体,其实是内存中的一小片区域。...如果变量类型是接口,那么它就成为值的指针,与此同时引用该值真正的类型。 如果变量即不是接口也不是结构体的指针,你无法完成同样的功能:只会得到一个运行时错误。...这些在编译阶段就会被检测为代码错误,还是非常智能的(虽然有时候挺闹心,我会 import 一个晚点用到的包,但是在我引用这个包之前,每当我保存代码时, IntelliJ 就会自动帮我删掉这个包)。
,编译器给了空类一个字节来唯一标识这个类的对象 类的成员函数不占用对象内存区,函数的分布位置为代码区,同一个类实例化的所有对象共享相同的函数。...硬件要求: 一些硬件平台(如ARM、x86等)的指令集直接要求对某些类型的数据进行对齐访问,否则会导致数据错误或触发硬件异常。例如,SSE指令在处理向量数据时就需要16字节对齐。...C++中通过引入this指针解决该问题 即:C++ 编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成 特性: this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。可以保护好指针内容。...如果通过一个空指针调用了成员函数,如同其他间接调用一样,这是典型的运行时错误,表现为“空指针异常”(Null Pointer Exception)。
那么既然成员函数不在类内部,如果是个空类(只有成员函数,无成员变量)呢?这个时候类的大小是多少呢?...三、this指针 在最开始,我们留下的问题还有一个没有解决,那就是指针问题,为什么把函数放在类内,就不用传指针了呢,这样还能运行吗?...那到底为什么不用指针就能访问呢?这就是不得不说一个默认存在类内部的指针——this指针。...,然而我们的祖师爷关注到了(可能他有时候也会犯这种错误),每次创建对象后还要专门初始化一下,那为什么不在类内直接初始化呢?...,首先我们从内容来分析,将本类的成员变量拷贝一份给新的类,没什么问题(注意这里都是同一个类,不同的对象,只要在类内就能访问私有成员)。
1).堆存放动态分配的对象——即那些在程序运行时动态分配的对象,比如 new 出来的对象,其生存期由程序控制; 2).栈用来保存定义在函数内的非static对象,如局部变量,仅在其定义的程序块运行时才存在...不管哪种属性,内类都是可以访问的 public 是一种暴露的手段,比如暴露接口,类的对象可以访问 private 是一种隐藏的手段,类的对象不能访问 protected 成员: 和 public 一样可以被子类继承...a.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态(基类的私有成员仍然是私有的,不能被这个派生类的子类所访问)。...b.私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员(并且不能被这个派生类的子类所访问)。...A f(); // 这个是不是可以看做声明了一个返回值为A的函数,函数名为 f,参数无 A g(A()); // 这个是不是可以看做声明了一个返回值为A的函数,函数名为 g, 参数类型为函数指针,这个函数指针的返回值类型为
领取专属 10元无门槛券
手把手带您无忧上云