这样的话,我们的这个类就是不可以被继承的,具体而言就会体现在这个我们在主函数里面使用这个类创建对象的时候就会报错; (3)上面介绍的就是一种直接的方式,我们下面介绍一种间接的不可以被继承的方式,就是使用的C+ base2的起始位置,而且可以访问的空间只有base2的范围,但是这个p3指针指向的位置就是这个空间的起始位置,但是这个指针可以访问的范围就会比较大,这个模型他是都可以进行访问的,因为这个指针是一个derive 当我们把这个题目稍微变换一下,就是把这个虚函数的virtula去掉,这个A要调用几次初始化,这个时候只会进行两次初始化,这个时候的打印结果就是ABABC,因为这个时候已经不是虚继承了,而是普通的继承,B里面有一个A,C里面也有一个 的初始化要想执行三次,就必须要要3个A对象,但是这个菱形继承里面显然是没有3个A对象的,因此只会进行两次初始化; 我们把这个题目在虚继承的基础上面,把继承的顺序变换一下,就是原来的这个题目是先继承B,再去继承C, 但是这个D里面的初始化列表的顺序是不变的,这个时候虽然在初始化列表里面显示B,后是C,但是这个打印的时候是按照声明的顺序打印的,这个里面集继承的顺序就是声明的顺序,即ACBD; 由此可见,这个继承里面的虚继承相对复杂
2.非类型模板参数必须在编译期就能确认结果。 以下用法是错误的,因为N不确定。 template<class T1, class T2> class Data { public: Data() { cout << "Data<T1, T2>" << endl; } private template<class T1, class T2> class Data { public: Data() { cout << "Data<T1, T2>" << endl; } private 模板总结 模板的优点: 1.代码可以复用,节省资源,提高效率,便于更快迭代开发,C++标准模板(STL)因此而生。 2.代码更灵活。 模板的缺点: 1.代码膨胀,编译时间变长。 2.模板出现错误时,信息容易错乱,不利于排查。 拜拜,下期再见 摸鱼ing✨
这次带来的是C++中关于继承这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 2. 菱形继承 菱形继承是多继承的一种特殊情况。 从这个点也可以看出,多继承算是c++的一个缺陷,在之后的一些编程语言里就没有多继承比如java。 多继承中指针偏移问题 接下来我们观察一段代码: class Student { public: int _b1; }; class Person { public: int _b2; }; class = &d; Assistant* p3 = &d; return 0; } p1、p2、p3都指向哪里?
) + (y) //#define ADD(x, y) ((x) + (y)); #define ADD(x, y) ((x) + (y)) 7.1 概念 以inline修饰的函数叫做内联函数,编译时C+ 8.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么? void TestAuto() { auto a = 1, b = 2; auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同 } 8.4 array; p < array + sizeof(array)/ sizeof(array[0]); ++p) cout << *p << endl; } 对于一个 有范围的集合 而言,由程序员来说明循环的范围是多余的 指针空值nullptr(C++11) 10.1 C++98中的指针空值 在良好的 C/C++ 编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针
int i=count % 10; //局部变量 cout<<"count % 10="<<i<<endl; //"count % 10="为字符串常量 } void func<em>2</em>( //静态局部变量 cout<<"out="<out<<endl; func1(); func<em>2</em>(); return 0; } 在这个例子中我尽量表现了各种情况,虽然写得很不合理… 先给出<em>C++</em>内存的一个模型图: ? 对于一个<em>C++</em>程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区和stack区。 上面程序中的main函数和func1,func<em>2</em>中的非static类型的变量在调用时都会加载到该区域。
参考http://blog.chinaunix.net/uid/20039893/frmd/49956.html及其他一些网上资料,C++程序员的Python入门。 sequence: string(不可变)、list、tuple(不可变) mapping: dictionary,类似stl中的map 可变和不可变类似于c+ 函数传参方式 关键字赋值法:不像C/C++,形参的顺序是可根据传参顺序改变,如:F(arg2 = 2, arg1 = 1) F(arg1,arg2,...) 类似的形式, 则arg1 = {('x' : 1), ('y' : 2)} 17. lambda函数 与C++不同,lambda在Python中只能是一行,可以使用';',但不能使用for/while 类相关 __init__(self) 类的构造函数,如果传参可写为__init__(self, arg1, arg2...),类似于c++中的bind。
2 的幂 难度简单540收藏分享切换为英文接收动态反馈 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入: n = 1 输出: true 解释: 20 = 1 示例 2: 输入: n = 16 输出: true 解释: 24 = 16 示例 3: 输入: n = 3 输出: false 示例 isPowerOfTwo(int n) { // n - 1就是把n的二进制位的最右边的那个1去掉 如果这个时候去掉了最右边的那个1 // 这个还是很妙的 如果n真的是2的幂的话
前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的 一、缺省函数 1.1什么是缺省函数 但其实在实际编写代码的过程中,我们有些时候会频繁地调用某个函数,而这个函数的其他参数是固定值,在c中遇到这种情况,便只能老实写参数,即使这几个参数的数值你已经写了无数次了,但你依然得去写它,而在c++中 而在C++中,反而支持这种行为,这是为什么呢? C++之父Bjarne Stroustrup,在写出C++这门语言之前是当之无愧大大C语言大师,而他之所以会去写一个新的语言,纯粹是因为他觉得这C语言也太费劲了,这也不行那也不行,我想搞几个名字相同,功能类似 而在C++中就可以不用这么麻烦,直接float add(float a,float b);int add(int a,int b);完全不需要再去取新的名字,一个名字就搞定了,C++会自动识别参数的类型
本篇介绍 本篇继续C++的模版介绍 std::enable_if<> enable_if<> 的作用是满足条件后可以使用模版推导,基于SFINAE(substitution failure is not 有时候也可以这样写: template<typename T, typename = std::enable_if_t<(sizeof(T) > 4)>> void foo() { } 在C+ template<typename T> concept ConvertibleToString = std::is_convertible_v<T,std::string>; 编译时的if c+ (args)>0 (since C++17) } } enable_shared_from_this 遇到需要用this 构造shared_ptr的时候都需要继承一下 enable_shared_from_this
看看我们的这个编译器是如何进行扩容的; 我们可以发现,这个里面编译器一共是进行了4次扩容,第一次是以二倍的数量进行扩容,剩下的几次是以1.5倍的方式进行扩容的,这个是编译器决定的,例如在这个gcc编译器上面就是以2倍的方式进行扩容的 ; (2)上面的我们是使用的push_back函数插入数据,看看这个编译器是如何进行扩容的,实际上我们也是可以调用这个reserve函数进行扩容的: 我们这个时候就可以发现,我们使用reverse函数进行扩容的时候 函数是不会缩空间的,就是当我们开的空间过大的时候,他不会释放掉多余的空间,实际上就算是缩的话,代价也是很大的,因为这个缩的话也是异地进行的,就是先拷贝一份,然后在这个拷贝的缩小空间,再把原来的空间给释放掉; 2. ,经过这个at函数的加加变成了打印出来的j字符; 4.一些运算符的重载说明 (1)我们可以调用库里面的函数在这个尾部插入字符,例如我们可以调用这个append函数,push_back函数插入字符; (2) 模版的那个就是库里面提供的函数,我们使用swap(str2,str3)就会执行非成员函数,我们使用str2.swap(str3)就会执行成员函数,那个模版的库函数不会被使用到,这个也是当时设计的时候就考虑到的问题
_count) << " " << &(s2. int _d; }; int main() { D d; d.B::_a = 1; d.C::_a = 2; //d. _c = 4; d. int _d; }; int main() { D d; d.B::_a = 1; d.C::_a = 2; d. 4 继承的总结和反思 在effective C++中提到,如果面临选择继承还是组合的时候,请优先选择组合,组合就是这样: class M { public: A _a; }; 也就是成员变量是其他自定义类型的
所以呢,想要交换,我们可在参数列表部分使用引用即可,现在了解一下捕获的一些其他用法: int main() { int a = 2, b = 1,c = 2,d = 3; auto Fs1 = [= ]()mutable { a++, b++, c++, d++; }; auto Fs2 = [&](){ a++, b++, c++, d++; }; auto Fs3 = [&a]() { a+ +; }; auto Fs4 = [&, a]() { b++,c++,d++ ; }; return 0; } 这里我们可以总结为: 1 [=]以传值的方式捕获局部域中的所有变量 2 [&]以引用的方式捕获局部域中的所有变量 因为模板的可变参数,在C语言里面可以一次性打印多个值(只用一次printf),那么我们想用C++实现怎么办呢? 在printf里面,参数包的底层是一个数组,但是C++里面,参数包我们只能说它是一个集合,所以当我们传了参数进去,但是不能像使用for遍历一个数组一样去遍历这个参数包了。
本篇可以解决的问题: 为什么C语言没有函数重载,为什么C++有函数重载? C++如何实现函数重载? 问题引入 首先回顾一下什么是函数重载? 函数重载(C++) 因为是偏向底层的讲解,所以这里不适用VS(IDE),而是使用Linux来展现整个过程。 首先我们回顾一下学习C语言的过程中,可执行文件的生成过程? 这里没有解释返回类型的指令,这也可以说明为什么C++的返回类型不能作为函数重载条件的原因! 2. C语言中的处理 创建三个文件: 我们再在Linux下看看C语言是如何处理函数名的 可以看出,C语言对于函数的描述只有函数名本身,并没有参数的相关信息。 总结 C++支持重载的原因是,再生成符号表示,对于函数的命名规则有了新的变化:_Z+函数名长度+函数名+类型首字母 而在新的命名规则下,依然没有返回类型的相关信息,因此返回类型对于函数重载没有影响 C语言对于函数命名的处理中
前言 之前我们深入探讨了模板的概念、重要性及其在C++编程中的应用: 【c++】模板详解(1)-CSDN博客 通过模板,我们实现了代码的复用,并且初步理解了泛型编程。 在c++20之前,非类型参数只能是整形、枚举类型或指针类型的值。c++20之后,才可以使用其他类型的值作为参数。 二、模板的特化 1. 2. 将声明和定义放在同一头文件当中(推荐) 2. 在定义位置进行显式实例化的声明(不推荐,很不实用) 四、模板优缺点总结 最后,我们总结一下c++中模板的优点和缺点: 优点 1. 可扩展性:模板提供了一种扩展C++语言的机制,可以通过在模板中添加特定的功能来扩展语言的能力(如STL),满足了复杂的应用需求。 缺点 1.
文本文件读取操作 读取文件操作: 1.包含头文件:#include< fstream > 2.创建流对象:ifstream ifs 3.打开文件,判断文件是否打开成功:ifs.open(“打开路径 buf1; //getline(输入流,字符串) while(getline(ifs,buf1)) { cout << buf1 << endl; } //第四种 char c; //ifs.get()每次读取一个字符 //EOF文件结束标识符 while ((c = ifs.get() )! = EOF) { cout << c ; } ifs.close(); } int main() { test(); return 0; }
() { cout << "Base2::func1" << endl; } virtual void func2() { cout << "Base2::func2" << endl; } private ) { cout << "B::func2" << endl; } int _b; }; class C : public A { public: virtual void func3() { cout << "C::func3" << endl; } int _c; }; class D : public B, public C { public: virtual void func4() { ) { cout << "B::func2" << endl; } int _b; }; class C : virtual public A { public: virtual void func3 这里直接来看D的对象模型: int main() { D d; cout << sizeof(d) << endl; d.B::_a = 1; d.C::_a = 2; d.
1.2 引用的特性 外号可以有一个,也可以有多个,所以: int main() { int a = 1; int& b = a; int& c = b; int& d = c; cout << int main() { int a = 1,c = 1; int& b = a; int& b = c; return 0; } 此时代码就会报错,因为b重定义了。 int arr[10] = { 0 }; for (int i = 0; i < 10; i++) { ; } return 0; } 在C++里面,对于一个有确定范围的循环,是可以使用范围 在C++11中为了区分开来,关键字nullptr表示空指针。 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 以上就是C到C++引入的一些小语法,感谢阅读!
C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。 (int a, double b, const char* c) { // 函数体 } 2.函数重载 在C++中,函数重载(Function Overloading)是指在同一作用域内可以存在多个同名函数 函数重载是C++多态性的一种形式,它允许程序员使用相同的名字来执行相似的操作,这增强了代码的清晰性和可读性。 3.引用 3.1引用的概念和定义 在 C++ 中,引用是一个变量的别名。 C++的引用跟其他语言的引用(如Java)是有很大的区别的,除了用法,最大的点,C++引用定义后不能改变指向,java的引用可以改变指向。 5.一些主要用C代码实现版本数据结构教材中,使用C++引用替代指针传参,用的是简化程序,避开复杂的指针。
大数据文摘出品 作者:蒋宝尚 C和C++在互联企业开发工作中有着非常重要的地位,在《顶级数据团队建设全景报告》中我们通过对企业的调研,发现C和C++是含金量指数最高的编程工具。 所以,只要你对C和C++有着超强的码力,那么你距离迎娶白富美,走上人生的巅峰就就不远了... ... 成为人生赢家之前,你需要先获得一份C和C++相关的工作。 今天文摘菌就给大家推荐一份C和C++的面试资料。 资料地址: https://github.com/huihut/interview#%E7%AE%97%E6%B3%95 这份资料一直在不断的更新,从目录中可以看出,除了C和C++相关知识的总结还有数据结构
这是一个 C++ 程序员自己总结的 Java 学习中应该注意的点。 ,也遇到一些与 C++ 里的习惯不符需要注意的地方。 初学时的计划是看完一本 Java 教材,过程中整理 C++ 程序员学习 Java 需要注意的点,然后对照写一篇《C++ 程序员的 Java 指南》,但最后懒癌犯了,只整理了一部分不同点,要形成一份「指南 java 中有 instanceof 运算符,c++ 中对应的 RTTI 方式是(typeid)? java 中的 abstract 方法不能有方法体,c++ 中的 pure virtual 函数可以有实现。