初识c++

1|0C++之父-本贾尼·斯特劳斯特卢普

示例代码

#include <iostream> //C++标准输入输出流的头文件 等同于C语言stdio.h using namespace std; // 为了减少命名冲突 int main(int argc, char const *argv[]) { cout << "hello world c++" << endl; return 0; }

image

2|0作用域控制符

使用作用域访问符::访问全局变量

3|0命名空间

namespace A { int a = 20; int b = 30; } namespace B { int a = 20; int b = 30; }

匿名空间里的都是内部链接

using 引用声明

4|0结构体Struct

#include <iostream> using namespace std; struct Person { string name; int age; string getname() { return name; } }; int main(void) { Person p1 = {"小明", 18}; }

C++类型检查更加严格

C++三目运算后返回的是变量

c语言,全局const变量存放在只读数据段
c语言,局部const变量存放在栈区

C++默认支持变长数组

在c++中,一个const不必创建内存空间,而在c中,一个const总是需要一块内存空间

c中const默认是外部链接。c++中const默认是内部链接

C++宏定义不受命名空间的约束

int a = 10;
int& ra = a;

Type& ra = a;

/引用的本质就是一个常指针/ 指针常量
/作用是减少指针的使用/

char*& pp;

#include <iostream> using namespace std; void my_free(char*& p) { free(p); p = NULL; } int main(void) { char* p = (char*)malloc(10); my_free(p); return 0; }

struct里的成员函数编译器会默认在前面加inline关键字
inline用在函数定义
类中的成员函数默认都是内联函数(不加inline也是内联函数)
有时候就算加上inline也不一定是内联函数
构成重载的条件:1. 在同一个作用域 2. 函数名相同
main函数是被_start调用的

C++编译器会对程序中的函数做换名,
将参数表中的类型信息汇合到函数名中,以保证函数名的唯一。
通过extern "C",可以要求编译器不做C++换名,以方便在C语言的模块中使用C++编译生成的代码。

方式一: extern "C" { int add (int a, int b) { return a + b; } int sub (int a,int b) { return a - b; } } 方式二: extern "C" int add (int a, int b, int c) { return a + b + c; }

class里的默认权限是private
struct里的默认权限是public

构造函数是编译器自动调用,作用是初始化实例变量

析构函数

不要用拷贝构造函数初始化匿名对象

初始化列表只用在构造函数中

explicit禁止构造函数隐式转换

delete表达式先调用析构函数,然后释放内存

类对象中只有成员变量占空间,成员函数和静态变量是不占空间的

类的大小也要遵循对齐补齐规则

#pragma pack(1) 改变默认对齐数

结构体里不能使用静态数据成员,因为结构体中的静态数据成员,默认放在只读文本(.text)段

结构体中的静态数据成员和类一样,属于结构体变量之间共享,必须在结构体之外初始化

friend只能出现在声明处(类中)

友元关系不能被继承

友元关系是单向的

友元关系不具有传递性

全局函数运算符重载+

int operator+(Person& p1, Person& p1) { return p1.money + p2.money; }

ostream类不允许拷贝构造

operator& operator<<(ostream cout, Person p) { cout << p.name << "现在有" << p.name << "块钱" return cout; }

三元运算符不能重载

2023-09-26 09:28:20 星期二

不能连续后置++

子类继承父类,并不是父类的所有成员都能被子类继承,构造函数,析构函数,赋值运算符都不能被子类继承

纯虚函数的意义就是提供接口

父类的引用/指针,指向子类的对象

class BoiledDrinks { public: // 煮 virtual void boil(void)=0; // 冲泡 virtual void brew(void)=0; // 搅拌 virtual void mix(void)=0; // 品尝 virtual void taste(void)=0; void enjoy(void) { boil(); brew(); mix(); taste(); } }; class Coffee:public BoiledDrinks { public: // 煮 void boil(void) { cout << "煮咖啡"<< endl; } // 冲泡 void brew(void) { cout << "冲泡咖啡"<< endl; } // 搅拌 void mix(void) { cout << "搅拌咖啡"<< endl; } // 品尝 void taste(void) { cout << "品尝咖啡"<< endl; } }; class Tea:public BoiledDrinks { public: // 煮 void boil(void) { cout << "煮茶"<< endl; } // 冲泡 void brew(void) { cout << "冲泡茶"<< endl; } // 搅拌 void mix(void) { cout << "搅拌茶"<< endl; } // 品尝 void taste(void) { cout << "喝茶"<< endl; } }; void boiledBeverages(BoiledDrinks& ob) { ob.enjoy(); return; } int main(int argc, char const *argv[]) { Coffee co; Tea t; BoiledDrinks& b1 = co; BoiledDrinks& b2 = t; boiledBeverages(b1); cout << "------------------" << endl; boiledBeverages(b2); return 0; }

虚析构的作用就是通过父类指针,释放子类的所有空间
纯虚析构函数在类中声明,在类外实现


__EOF__

本文作者若达萨罗
本文链接https://www.cnblogs.com/bcc0729/p/17718437.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   若达萨罗  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示