关于c++的inline关键字,以下说法正确的是( )
A.使用inline关键字的函数会被编译器在调用处展开B.头文件中可以包含inline函数的声明C.可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数D.递归函数也都可以成为inline函数
A.inline只是一种建议,需要看此函数是否能够成为内联函数,具体看编译器。
B. inline函数不支持声明和定义分离,编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,即该函数是没有地址的,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的。
C.inline函数会在调用的地方展开,所以符号表中不会有inline函数的符号名,不存在链接冲突。
D.比较长的函数,递归函数就算定义为inline,也会被编译器忽略。
故选C。
下面描述错误的是( )
A.this指针是非静态成员函数的隐含形参.B.每个非静态的成员函数都有一个this指针.C.this指针是存在对象里面的.D.this指针可以为空
A.静态成员函数没有this指针,只有非静态成员函数才有,且为隐藏指针。
B.非静态成员函数 ...
经济学人
未读
经济学人-科技
木星卫星上可能存在生命(上)506词Besides Earth itself, Mars is the most-studied planet in the solar(adj.太阳的;日光的;利用太阳光的;与太阳相关的n.日光浴室)system.除了地球,火星是太阳系中研究最多的行星。One reason for the abundance (n. 大量,充足) of probes and landers, of course, is that Mars is relatively (adv.相对地,比较而言;相当 相对来说;相比较而言)close.探测器和着陆器数量众多的原因之一当然是火星距离地球相对较近Another is that Mars appears to have once had plenty of liquid(adj.液体的;清澈的;明亮的;易变的n.液体,流体;[语]流音) water on its surface(n.表面;外观;表层 adj.表面的,肤浅的).另一个原因是火星表面似乎曾经有大量液态水。And where there is ...
编程语言
未读
最近学到了string的相关的库,于是为了加深对函数的理解便打算模拟实现一下常用的string库函数。
引入这是一个简单的string类的用法。
12345678910#include <string>#include <iostream>int main() { std::string str = "Hello, world!"; std::cout << "The length of the string is: " << str.size() << std::endl; return 0;}
由上可见,string类是C++标准库中的一个类,它定义在std命名空间中。因此,当使用string类时,需要指定其命名空间为std,若未定义,则可能被认为是未定义的标识符,从而导致错误。
std是C++标准库中定义的命名空间,它包含了许多C++标准库中的类、函数和类型定义。在C++中,命名空间提供了一种将名称隔离开来以避免名称冲突的机制。这样,不 ...
学到了cpp的继承和多态这块,感觉知识点还是很细碎繁杂的,所以就写了一篇博客记录一下在这一块遇到的一些容易搞错的问题。
三种继承
cpp的三种继承:public(公有继承)、protected(保护继承)和private(私有继承)。
公有继承公有继承是最常见的继承方式,基类的公有成员在派生类中仍然是公有的,保护成员在派生类中变为保护的,私有成员在派生类中是不可访问的。使用public关键字来表示公有继承。
123456789101112131415161718192021222324252627282930313233#include <iostream>// 基类class Base {public: int publicVar; void publicFunc() { std::cout << "Base::publicFunc()" << std::endl; }protected: int protectedVar;private: int ...
在c/c++内存如何分布在一个程序的运行过程中,总是需要存储一些数据。这些数据可以粗略的被分为:
常量数据
局部数据
静态数据与全局数据
动态申请数据
在c/c++中,内存可以分为四个区域:栈区、堆区、静态区和常量区。它们分别用于存储不同类型的数据,如下所示:
栈区:栈区是由编译器自动分配和释放的内存区域。它用于存储局部变量、函数参数和函数返回地址等。栈区是一个连续的内存块,它的大小是固定的。当程序执行离开一个函数时,栈中的内存就会被自动释放。为什么形参是实参的拷贝就与栈帧(栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame)。)有关,二者是通过栈帧与寄存器的一些操作来实现数据传输的。并且建立栈帧的主要目的就是存储局部的数据。
堆区:堆区是由程序员手动分配和释放的内存区域。它用于存储动态分配的对象,如new操作符创建的对象。堆区是一个不连续的内存块,它的大小可以动态地调整。因此,堆区的内存容量比栈区大得多。程序员需要手动释放堆区中的内存, ...
在之前的成员函数一文中谈到过构造函数,在创建对象时,编译器会调用构造函数,为成员变量进行赋值。但这个操作并不是初始化,初始化只能有一次,而在构造函数里面是可以进行多次赋值的。初始化的工作通常可以交由初始化列表来执行。
什么是初始化列表?C++的初始化列表是一种在创建对象时初始化成员变量的特殊语法。它的存在可以显著的提高代码的可读性和性能。在C++中,当我们创建一个对象时,我们需要为其成员变量赋值。通常情况下,我们会在构造函数中对成员变量赋值。但是,当对象中有大量成员变量时,这种方法可能会让代码变得冗长。C++的初始化列表提供了一种更简洁、更清晰的方法来初始化成员变量。它使用冒号分隔符来定义一个初始化列表,并在其中列出成员变量及其初始值。下面是一个类:
123456789class A{private: int a; double b;public: A(int a1,int b1) : a(a1),b(b1) {}};
在上述的代码里,使用了初始化列表来为a与b赋值而没有经过构造函数体内 ...
编程语言
未读
在C++中,有许多默认成员函数,如默认构造函数、拷贝构造函数和析构函数等。这些默认成员函数在代码中扮演着重要的角色,它们可以帮助开发者快速构建对象、复制对象和释放对象。然而,这些默认成员函数的使用也有一些需要注意的细节和技巧。本文将详细介绍C++中的默认成员函数,包括其作用、使用方法、注意事项和实例说明等,旨在帮助读者深入了解和掌握这些重要的语言特性,从而写出更加高效可靠的代码。
概览一个类没有成员,称为空类。但一个空类却并不为空。编译器会在其中为开发者默认生成了两大类成员函数。
构造函数:当创建一个对象时,如果没有显式地提供构造函数,编译器会自动生成一个默认构造函数。默认构造函数的主要功能是初始化成员变量,使对象能够正确地工作。
析构函数:当一个对象生命周期结束时,如果没有显式地提供析构函数,编译器会自动生成一个默认的析构函数。析构函数的主要功能是释放对象占用的资源,如释放动态分配的内存等。
拷贝构造函数:当一个对象要被复制到另一个对象中时,如果没有显式地提供拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。拷贝构造函数的主要功能是将一个已有对象的值复制到新的对象中。
拷贝赋 ...
结构体对齐什么叫结构体对齐?
结构体对齐是内存对齐的一种应用,主要是为了使结构体中的各个成员在内存中按照一定的规则排列,以符合CPU对数据访问的要求。某些CPU对于访问内存中的数据要求必须按照一定的边界对齐。没有对齐可能导致CPU多次读取内存,从而降低性能。内存对齐也可以简化编译器的设计,不用处理没有对齐的复杂情况。
结构体对齐基础规则
第一个成员在结构体变量偏移量为0的地址处
其他成员变量要对齐到对齐数的整数倍的地址处
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。(VS中默认的值为8、Linux环境默认不设对齐数(对齐数是结构体成员自身的大小))
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
看着文字可能有点懵,上个例子:
12345struct Example { char a; // 1 字节 int b; // 4 字节 short c; // 2 字节};
a在地址0x00,占用1字节为了保证b能够aligned到4字节边界(b的对齐数是4,存放地址 ...
前言: 最近学到了c++中的引用,发现引用和c中所学到的指针有着很相似的效果,但在c++中仍然有着指针的一席之地,想必二者的适用场景是各有千秋,于是查阅资料,写了此文来方便日后复习。
引用的基本知识概念
引用是C++中的一种数据类型,它是一种类似于指针的变量。引用可以被认为是一个变量的别名(比如你名字叫大明,外号叫小明,别人喊小明你肯定就知道是在叫你),它提供了一种访问变量的方式,使得程序员可以通过不同的名称来操作同一个变量(喊大明小明都是在叫你),从而简化了代码的编写。引用的语法非常简单,可以通过在变量名前面加上“&”符号来定义一个引用。例如,如果我们定义了一个整型变量a,可以通过以下语句来定义一个引用b:
12int a = 10;int &b = a;
这样,变量b就成为了变量a的别名,它们指向同一个内存地址(这点非常重要)。因此,对变量b的操作也会影响到变量a。
引用的适用场景
引用必须在定义时进行初始化。一旦引用被初始化,它将一直指向该变量,并不能再被改变。
引用可以作为函数参数传递。通过引用传递参数可以避免复制大量的数据,提高程序的效率。
引用可以作 ...
编程语言
未读
在c++中,有一种用法,名叫函数重载,函数重载是c++中一个非常重要的特性,它允许程序员定义同名但参数列表不同的函数,这样可以方便地实现代码复用和提高程序的可读性。但是在学习过程中令我感到奇怪的是,C却并不支持这一做法。于是通过查阅资料,完成了此篇博客。
函数重载函数重载指的是在同一个作用域内,可以定义多个同名但参数列表不同的函数。例如:如下是两个同名的add函数,功能是将两数相加并返回。
123456int add(int a, int b) { return a + b;}double add(double a, double b) { return a + b;}
虽然都是add,但是它们的参数列表不同,一个是两个整数,一个是两个浮点数。当调用add函数时,编译器会根据实参的类型和数量来选择调用哪一个函数。例如:
12int x = add(1, 2); // 调用int add(int, int)double y = add(1.0, 2.0); // 调用double add(double, doub ...