做推广的的网站模板,推广网站的图片怎么做,网站建设合同 英文范文,潍坊建设局网站1#xff0c;函数模板缺省情况下都是内联的 需要进一步的学习
父类析构函数为非虚函数#xff0c;子类为虚函数_zhl11a的专栏-CSDN博客_父类的析构函数是非虚的父类析构函数为非虚函数#xff0c;子类为虚函数 delete子类指针(指向这个子类对象)会调用父类的析构函数
#i…1函数模板缺省情况下都是内联的 需要进一步的学习
父类析构函数为非虚函数子类为虚函数_zhl11a的专栏-CSDN博客_父类的析构函数是非虚的父类析构函数为非虚函数子类为虚函数 delete子类指针(指向这个子类对象)会调用父类的析构函数
#include iostream
using namespace std;class Base
{
public:~Base(){cout~Base()endl;}};class ABase : public Base
{
public:virtual ~ABase(){cout~ABase()endl;}};int main(){Base *pBase new ABase;delete pBase;//此处出错getchar();return 0;}
assert断言
assert断言是用来检查非法情况而不是错误情况的用来帮开发者快速定位问题的位置。如果表达式为假0那么首先向错误流strerr打印一条错误信息然后通过abort函数终止程序的运行。NDEBUG宏打开状态时assert宏是可用的。默认情况下assert宏只有在Debug版本才起作用而在Release版本中将被忽略。但在许多操作系统的C程序中Release版本中也将NDEBUG宏依然为打开状态。 断言不是用于处理错误情况的断言assert函数C语言assert函数完全攻略C/C 学习笔记八断言与异常处理 - 云社区 - 腾讯云
类的析构函数可以是虚函数 但是构造函数不可以
调用构造函数时还不能确定对象的真实类型因为子类会调父类的构造函数而且构造函数的作用是提供初始化在对象生命期只执行一次不是对象的动态行为也没有太大的必要成为虚函数纯虚拟函数是用来提供函数接口的虚拟函数是用来提供函数接口和默认的函数操作非虚拟函数是用来提供函数操作的。构造函数析构函数可不可以是虚函数_学海无涯-CSDN博客
类中有指向其他资源的指针且这个资源由类本身进行释放那么可以使用编译系统生成的默认构造函数进行对象的复制
C有关拷贝构造函数默认/浅/深拷贝构造函数 - Hk_Mayfly - 博客园
子类可以访问父类的保护成员子类友元类可以通过子类对象去访问父类的保护成员
#include iostreamclass father{
protected:int father_protected 123;
public:int father_public 456;
};class son : public father{
public:void print_protected(){std::cout father_protected std::endl;}void print_public(){std::cout father_public std::endl;}int wed 123;friend class son_friend;
};class son_friend{
public:void friend_print(son son1){
// std::cout son1.wed std::endl;
// son1.print_public();son1.print_protected();}
};
int main(){son son1;son1.wed 456789;son_friend ofo;ofo.friend_print(son1);
}
两个指针p和q指向同一个数组则他们可以进行关系运算例如pq,p!q,指针可以做减法操作指针可以同整数相加减 正确 int a[10]{0,1,2,3,4,5,6,7,8,9};int *p a;int *q a[9];std::cout p和q之间的距离是 q-p std::endl;std::cout 在p的基础上移动 8个距离后的数值为 *(p8) std::endl;
判断以下定义是否正确 错误
使用const进行修饰 因此在函数的内部 不可以对元素进行修改去掉const 编译通过
class Date{
private:int d,m,y;
public:int year() const {return y;};
};
const 成员函数 如果不使用const修饰符 就会造成对于函数的返回数组进行修改
class A{
private:int data;
public:A(int num):data(num){};~A(){};int get_data(){return data;}
};int main(){A a(1);a.get_data() 4;std::cout a.get_data() std::endl;
}
使用const进行限定 阻止对于参数的修改
class A{
private:int data;
public:A(int num):data(num){};~A(){};const int get_data(){return data;}
};int main(){A a(1);
// a.get_data() 4;// 不允许std::cout a.get_data() std::endl;
}
class A{
private:int data;
public:A(int num):data(num){};~A(){};int get_data(){return data;}
};int main(){const A a(1);
// a.get_data() 4;// 不允许get_data(a);//错误std::cout a.get_data() std::endl;
} a 是一个const 对象 它调用了 get_data 方法所以函数签名应该是 get_data(a){} 而 a是一个 const 对象 我们默认的 this 指针并不是 const 类型所以参数类型不匹配 编译无法通过 这下我们终于清楚了 const 修饰成员函数 根本上是修饰了 this 指针。 补充一点如果成员函数同时具有 const 和 non-const 两个版本的话 const 对象只能调用const成员函数 non-const 对象只能调用 non-const 成员函数。 梳理c const 修饰函数 - 知乎
子类没有定义构造函数则调用父类的无参数的构造方法否则不调用父类无参构造函数
在C中子类继承和调用父类的构造函数方法_菜头-CSDN博客_c子类构造函数调用父类构造函数子类可以继承父类所有的成员变量和成员方法但不继承父类的构造方法因此在创建子类对象时为了初始化从父类继承来的数据成员系统需要调用其父类的构造方法如果没有显式的构造函数编译器会给一个默认的构造函数并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建如果子类没有定义构造方法则调用父类的无参数的构造方法如果子类定义了构造方法不论是无参数还是带参数在创建子类的对象的时候,首先执行父类无参数的构造方法然后执行自己的构造方法在创建子类对象时候如果子类的构造函数没有显示调用父类的构造函数则会调用父类的默认无参构造函数在创建子类对象时候如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数则会调用父类自己的无参构造函数在创建子类对象时候如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数则会出错如果父类只有有参数的构造方法则子类必须显示调用此带参构造方法如果子类调用父类带参数的构造方法需要用初始化父类成员对象的方式
// 子类无构造方法 则调用父类的无参数的构造方法
class father_1{
public:father_1(){std::cout father 1 create!\n;}
};class children_1 : public father_1{};
int main(){children_1 children1;
}
//子类定义了构造函数 则先调用父类的构造函数 再次调用子类的构造函数
class father_1{
public:father_1(){std::cout father 1 create!\n;}
};class children_1 : public father_1{
public:children_1(){std::cout children_1 create!\n;}
};
int main(){children_1 *child new children_1();}
虚函数是可以内联的吗可以减少函数调用的开销提高效率
C面试题虚函数virtual可以是内联函数inline吗_changyi9995的博客-CSDN博客虚函数可以是内联函数内联是可以修饰虚函数的但是当虚函数表现多态性的时候不能内联。内联是在发生在编译期间编译器会自主选择内联而虚函数的多态性在运行期编译器无法知道运行期调用哪个代码因此虚函数表现为多态性时运行期不可以内联。 inline virtual唯一可以内联的时候是编译器知道所调用的对象是哪个类如 Base::who()这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。
class Base{
public:inline virtual void who(){std::cout I am Base\n;}virtual ~Base();
};class Derived : public Base{
public:inline void who(){std::cout I am Derived\n;}
};
int main(){// 此处的虚函数 who()是通过类Base的具体对象b来调用的// 编译期间就能确定了所以它可以是内联的但最终是否内联取决于编译器。Base b;b.who();// 此处的虚函数是通过指针调用的呈现多态性需要在运行时期间才能确定// 所以不能为内联。Base *ptr new Derived();ptr-who();// 因为Base有虚析构函数virtual ~Base() {}//所以 delete 时会先调用派生类Derived析构函数//再调用基类Base析构函数防止内存泄漏。delete ptr;ptr nullptr;}
链接给的例子 将析构函数定义为虚函数但是会出错除了删除的方式以外还可以将其定义为default的方式 virtual ~Base() default;
class Base{
public:inline virtual void who(){std::cout I am Base\n;}virtual ~Base() default;
};class Derived : public Base{
public:inline void who(){std::cout I am Derived\n;}
};
int main(){// 此处的虚函数 who()是通过类Base的具体对象b来调用的// 编译期间就能确定了所以它可以是内联的但最终是否内联取决于编译器。Base b;b.who();// 此处的虚函数是通过指针调用的呈现多态性需要在运行时期间才能确定// 所以不能为内联。Base *ptr new Derived();ptr-who();// 因为Base有虚析构函数virtual ~Base() {}//所以 delete 时会先调用派生类Derived析构函数//再调用基类Base析构函数防止内存泄漏。delete ptr;ptr nullptr;}
C命名空间必须要指定名字 错误 可以
C/C11中命名空间(namespace)的使用_网络资源是无限的-CSDN博客_c namespace未命名的命名空间(unnamed namespace)是指关键字namespace后紧跟花括号括起来的一系列声明语句。未命名的命名空间中定义的变量拥有静态生命周期它们在第一次使用前创建并且直到程序结束才销毁。 一个未命名的命名空间可以在某个给定的文件内不连续但是不能跨越多个文件。每个文件定义自己的未命名的命名空间如果两个文件都含有未命名的命名空间则这两个空间互相无关。如果一个头文件定义了未命名的命名空间则该命名空间中定义的名字将在每个包含了该头文件的文件中对应不同实体。和其它命名空间不同未命名的命名空间仅在特定的文件内有效其作用范围不会横跨多个不同的文件。
一个类可以有多个构造函数 但是只能有一个析构函数
理一理C的构造函数 - 知乎
二叉树的前序、中序后续遍历 常常使用递归的方式来实现
二叉树遍历的递归实现详解先序、中序、后序和层次遍历 - violet-evergarden - 博客园
友元函数破坏了类的封装性 #include机制用于将源程序片段收集在一起形成一个完整的编译单元作为编译器的输入。
C笔记随时更新_小明喜欢写bug的博客-CSDN博客 163条
关于纯虚函数 说法正确的是
具有纯虚函数的类称为虚基类 错误 虚基类是指虚继承的基类主要解决的是从不同路径多次继承同一个基类的问题与纯虚函数无关具有纯虚函数的类不能创建类对象 正确一个基类说明有纯虚函数其派生类一定要实现该纯虚函数 错误 可以不实现纯虚函数那么子类也将作为 纯虚类纯虚函数是一种特殊的虚函数 他是个空函数 错误 空函数是指不执行任何语句直接返回的函数显然纯虚函数不满足纯虚函数是一种特殊的虚函数,它是个空函数_百度知道
选择正确的语句是
int main(){char* pBuf new char(20);sprintf(pBuf,%s,This is a test.\n);printf(%s,pBuf);delete pBuf;
};编译过程中处理#include的语句的阶段是
预编译 感觉是预编译阶段但是没有找到明确的答案语法分析词法分析二进制代码
错误的赋值表达式 int mian(){int a[10];int*p nullptr;//赋值表达式的位置p a;//错误因为a就代表了地址 即 a的含义等效于a[0]p a[0];*p 1;p a;} 设置虚基类的目的是为了
消除二义性设置虚基类的目的是__牛客网多重继承定义
一个派生类D有2个或2个以上的基类B和C多重继承引起的二义性假如上述这些基类B和C具有相同的基类AA中的成员数据和成员函数最终都会以双份的形式拷贝到类D中那么调用的时候就会出现二义性问题。
虚基类
专门用来解决多重继承引起的二义性问题可以理解为D直接从A继承虚基类的具体实现的注意细节有很多这里不再列举了我认为只需要了解原理即可。
下列常量定义正确的是 const int VERSION 200;const int g_xx[4] {1,2,4,8};const char* const hh Hello world;
不确定enum Color{BLUE,RED};const enum Color gg BLUE; const enum Color gg BLUE;
// gg RED; //错误 被const修饰不可以更改const char* const hh Hello world; 关于命名空间的理解正确的是 搜查
通过使用声明引入的元素名字会遮蔽名字相同的非局部声明表达式::a 一般表示引用全局作用域中声明的元素a使用关键字namespace定义的命名空间必须要有显示的名字必须是独一无二的 错误可以不需要显示的名字名字空间是可以嵌套的 ✅
继承 和访问之间的关系
C继承公有私有保护 - csqlwy - 博客园程序执行后会有错误或者什么效果
数组访问越界会出现什么情况栈溢出堆栈溢出就是不顾堆栈中数据块大小向该数据块写入了过多的数据导致数据越界结果覆盖了老的堆栈数据。c/c 栈溢出、越界、泄漏_kevin的博客-CSDN博客_c栈溢出【堆栈和栈溢出】MSP430 数组填充越界引起的栈溢出 导致程序跑飞 - bandaoyu - 博客园Address Sanitizer 用法 - 简书 重点
#include iostream
#include vector#define MAX 255
int main(){
// unsigned char A[MAX];
// for (int i 0; i MAX8; i) {
// A[i] c;
// }unsigned char j a;std::vectorchartemp(MAX,\0);for (int i 0; i MAX; i) {temp.at(i) j;}for (int j 0; j MAX; j) {std::cout temp[j] ;}
}
关于动态库和静态库的说法 正确的是
程序运行的时候不需要静态库 正确静态库在程序编译的时候会被连接到目标代码中 错误静态库编译的时候会被直接拷贝动态库是被链接动态库在程序运行时才被载入 正确动态库 在程序编译的时候不会被连接到目标代码 错误
补充
库是一段编译好的二进制的代码加上头文件供别人进行调用使用库 的场景1不希望别人看到源码以库的方式进行封装只需要暴露头文件减少编译的时间因为库是已经编译好的二进制的代码编译的时候只需要简单的的link不需要浪费编译的时间
静态库
windows下是liblinux下是.a静态库在编译的时候会被直接拷贝一份复制到目标代码里面这段代码在目标程序里面就不会被改变了静态库的好处是 编译完成之后库文件就不会有作用了目标程序没有外部依赖直接就可以运行缺点就是使得目标体积变大
动态库
动态链接库win下是dlllinux下是somac下是dylib。动态库在编译的时候不会被拷贝到目标程序中目标程序只会存储动态库的引用。只有程序运行的时候才会被加载动态库不需要拷贝到目标程序中不会影响目标程序的体积同一份库文件可以被多个程序共用。编译才会被载入的特性因此随时可以对其进行替换。但是 动态加载会带来性能的损耗使用动态库很依赖外部的环境缺库会导致程序无法运行。
参考链接
静态库与动态库的区别_sheng_bin的博客-CSDN博客_动态库和静态库的区别
const 和 宏 的区别
宏缺少类型检查const具备严格的类型审查 正确宏在编译链接和运行的时候没有符号const常量在编译和调试的时候(打开编译器调试开关)可见宏定义在函数的内部函数作用域结束后仍然可用const常量只在作用域内可见宏在编译阶段展开 const常量在编译阶段处理 错误宏在预处理阶段const变量在编译阶段进行处理C类不占据内存 只有实例化对象之后才会占据内存
c关于类到底占不占内存的问题书上说类是不占内存的对象时占内存的。_百度知道
C语言中提供了哪些代码重用的方式
继承多态模板
关于运算符重载下列说法不正确的是
重载时 运算符的操作个数可以改变 错误重载时操作符的优先级可以改变 错误重载时运算符号的功能可以改变 正确重载时运算符号的结合性可以改变 错误
注意事项
不是所有的运算符号都可以被重载重载运算符号 不可以改变其优先级和结合性重载不会改变运算符的用法原有的操作数、操作数在左边还是在右边都不会被改变运算符重载不能有默认的参数运算符重载既可以作为类的成员函数也可以作为全局函数箭头运算符-、下标运算符[ ]、函数调用运算符( )、赋值运算符只能以成员函数的形式重载有关运算符重载正确的描述是。 __牛客网
虚函数说法正确的是
成员函数被声明为虚函数之后其派生类的同名函数都自动转换成 虚函数 正确虚函数不可以有函数体 错误 纯虚函数在函数可以拥有函数体但是类中只可以写纯虚函数的声明纯虚函数的定义必须写在类外通常如果一个类可以被继承构造函数和析构函数都有必要被定义为虚函数。错误析构函数一般可以被定义成虚函数但是构造函数是绝对不可以被定义为虚函数虚函数在基类中可不实现但是派生类中必须实现 错误 派生类也可以不实现我难道不配拥有函数体吗---【纯虚函数函数体】_Alice_lihao的博客-CSDN博客