一、C++基础

很久不用C++,学习openFOAM之前复习一下C和C++相关的基础知识

1.1常用操作符

++,–

整型变量的自加自减,用法很多。最简单的有i++,i–。运算速度会比i=i+1更快。
此外还有 j = i++ 和 j = ++ i ,前者表示先赋值后自加,后者表示先自加后赋值。
类似的用法还有 i += 1 ,实际等价于i=i+1。A+=B等价于A = A+B

!

取反符号,没什么好说的。matlab中对应符号~
!true = false
!1 = 0
!0 = 1
12!=1 = 1

%

取模运算符,即整除后的余数A%B等价于fortran中的mod(A,B)

& | 和 && ||

后者是逻辑运算与和或,对应fortran中的.and..or.,有0&&1=01&&1=1

&是按位与,例如15的二进制为00001111以及127的二进制为11111111。那么按位与结果为15&127=0x00001111&0x11111111=0x00001111=15(这么奇怪的运算谁会用啊。。。)

同样|表示按位或,即15&127=0x00001111&0x11111111=0x11111111=127

使用逻辑运算时要避免使用前者发生未知错误

三元运算符?:

直接给例子说明
a=2>1?3:4
此时2>1,所以执行左侧,即赋值a=3

1.2 openFOAM中的运算符

cin cout Info

cin>>a
cout<<b
这是C++自带的输入输出流,可对很多不同类型的变量输入输出,而openFOAM中一般使用并行运算,为了方便输出特殊定义了Info

外积、内积、双重积、差积

. *外积、&内积、&&双重积、^差积

1.3 条件,循环

if条件,注意大括号外没有逗号
if(condition) {...} else {...}
while循环
while(condition){...}
for循环,注意括号中为分号,(初始化;测试;更新)
for(i=1;i<10;i++){...}
switch选择
switch(expression)
{case1:...;
case2: ...;
default:...;}
跳出循环有三个指令, break跳出当前循环层;continue直接进行下一次循环,return退出当前函数

1.4 标识符可见范围

using namespace std的使用,参考该链接(https://blog.csdn.net/quyafeng2011/article/details/68921750)。简单的说,C++中的函数库并非在整个代码段中都是默认可见可以任意调用的,如果没有这样声明,就需要用类似这样的方式调用
std::cout << std::hex<< 3.4<< std::endl;
声明之后,可以直接写成
cout << hex<< 3.4<< endl;

1.5 数组

基础用法如下
double a[4];
double b[]={1,2,3} ;
C++中的数组模板

#include<vector>
using namespace std;
vector<double> a(5); // 大小为 大小为55的数组,初始化为0 
vector<double>b (5,1.0); //大小为5的数组,初始化为1.0
vector<double> c(b); //创建c为b一个副本

openFOAM编写的时候,C++的标准库还没有形成,所以openFOAM自行给定了一个库,和当前C++的标准库有区别。C++中的vector类似OpenFOAM中的list,而openFOAM中的vector是只有三个分量的向量

1.6 子函数相关

首先给一个代码段方便说明

void swap(int &a, int &b)
{int c = a;a = b;b = c;}int main(){int a = 1, b = 2;swap(a,b);cout<<"a="<<a<<",b="<<b<<endl;}

几个问题,

  • 首先函数名前面的返回值类型可以不写,默认为空类型void
  • 不同的函数可以有相同的名字,根据他们的输入值进行区分,这种技巧成为重载。
  • 输入的值可以设定为默认F(scalar a, scalar b=0);,但默认的输入值必须在最后。
    传参时,可以为swap(int a, int b),这是传值,swap(int &a, int &b)为传地址,后者更好。
    子函数内的值的作用域仅限当前子函数,如果子函数内想要调用全局的变量,需要使用::a

1.7 指针

给一个简单的例子

#include <iostream>using namespace std;int main ()
{int  var = 20;   // 实际变量的声明int  *ip;        // 指针变量的声明int bip = &var;       // 在指针变量中存储 var 的地址b = *ip //把ip存储的地址的值取出赋给breturn 0;
}

new初始化的指针需要用delete删除,而openFOAM中另外有autoPtr创建指针,可以自动删除

1.8 类型别名的定义

在openFOAM中大量使用,这里简单提到
typedef vector<double> doubleVector;
typypedef GeometricField<scalar, fvPatchField, volMesh> volScalarField;
typedef GeometricField<vector, fvPatchField, volMesh> volVectorField;

1.9 面向对象

类的定义与使用直接给一个简单的例子

#include <iostream>using namespace std;class Box
{public:double length;   // 长度double breadth;  // 宽度double height;   // 高度
};int main( )
{Box Box1;        // 声明 Box1,类型为 BoxBox Box2;        // 声明 Box2,类型为 Boxdouble volume = 0.0;     // 用于存储体积// box 1 详述Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0;// box 2 详述Box2.height = 10.0;Box2.length = 12.0;Box2.breadth = 13.0;// box 1 的体积volume = Box1.height * Box1.length * Box1.breadth;cout << "Box1 的体积:" << volume <<endl;// box 2 的体积volume = Box2.height * Box2.length * Box2.breadth;cout << "Box2 的体积:" << volume <<endl;return 0;
}
  • class声明了类box,用对象声明对象Box1,直接调用方式为Box1.height
  • 对象的指针也可以类似的声明box *Box2,而此时调用方式为Box2->height
  • 类内变量分public对类内和类外均可见protected仅对类内的和子类可见private仅对类内可见。

类会有一些内置函数,构造函数和析构函数比较常用,下面简单罗列


class Empty {
public:
Empty(); Empty(); // // 缺省构造函数
Empty( const Empty& ); // 复制构造函数
~Empty(); // 析构函数
Empty  & operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};
  • 构造函数和析构函数都是没有输入值的

这部分内容可能还需要扩充

1.10 关键字

const表示常量,初始化方式const int a=10;。表示变量赋初值后就不能再修改。

static通常在函数名前表示静态函数。静态函数可以使用类名直接调用,无需构造对象。用在类内变量上表示所有对象共享。用在函数中表示函数调用者共享,即函数调用完,该变量不会释放,而是保存当前值,知道整个程序结束。静态函数的调用方式如下


aut PtoPtr<incompressible::turbulenceModel> turbulence
(
incompressible::turbulenceModel::New(U, phi, laminarTransport)
);

openFOAM学习笔记(一)—— C++基础相关推荐

  1. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  2. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  3. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  4. 家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化

    目录 什么是数据库查询优化? 影响查询优化的因素 优化策略概述 查询优化的总体思路 语义优化 -- 内容等价性 语法优化(逻辑层优化)---语法等价性 执行优化(物理层优化) 查询优化在DBMS中的位 ...

  5. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  6. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

  7. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

  8. 菜鸟学习笔记:Java基础篇4(面向对象三大特征)

    菜鸟学习笔记:Java面向对象篇中 继承 概念 方法重写(override) Object类 Super关键字 组合 final关键字补充 封装 访问控制符 多态 继承 概念 继续上一篇的例子: #m ...

  9. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

  10. 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)

    菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...

最新文章

  1. dede login.php,DedeCms会员登录成功,又跳转到登录页面
  2. jwt token 附加用户信息_SpringBoot+JWT实现token验证并将用户信息存储到@注解内
  3. 使用SQLite学习SQL
  4. flask连接不到mysql数据库,即使使用了python flask mysql,也无法将数据提交到数据库(使用python flask mysql)连接.提交()...
  5. 寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序
  6. 2021牛客多校9 - Cells(推公式+NTT)
  7. Serverless 实战 —— 阿里云函数计算配合SpringBoot项目
  8. C99中的变长数组(VLA)
  9. css控制td比内容宽5px_CSS从零开始——布局
  10. 斐波那契数列c语言编程递归,C语言实现Fibonacci数列递归
  11. Rhino6.25软件安装教程|兼容WIN10
  12. UIKit的简单入门介绍
  13. 测试一枚-记录工作-覆盖率(二)
  14. 七日杀 服务器不显示,七日杀进服务器不显示画面 | 手游网游页游攻略大全
  15. RecyclerView 嵌套RecyclerView 或者 ScrollView当中嵌套RecyclerView ,子View会自动滚动到顶部
  16. 使团队高效的十种方法
  17. 库克和他的“后乔布斯”时代苹果
  18. 云之梦php免费教学视频下载_[全套视频] 云知梦2017最新PHP工程师全套视频教程 laravel框架版...
  19. python后端开发学习重点
  20. 纸面发布会伤害手机行业

热门文章

  1. VS SDK更新问题(error MSB8036: 找不到 Windows SDK 版本10.0.14393.0)
  2. HTML爱心照片墙源码
  3. 马云卸任后为物流站台 “菜鸟”将飞向何方
  4. 开营第二天,带你领略插画的力量
  5. writeline是什么意思_write是什么意思_write的翻译_音标_读音_用法_例句_爱词霸在线词典...
  6. 2020区块链50指数样本股大盘点:有人蹒跚学步,有人激流勇进
  7. SpringBoot整合Redis - @Cacheable 和 RedisTemplate
  8. 【网关路由测试】——网关状态转换测试
  9. python的增添删除查询列表
  10. 编译Chromium OS