C++初学杂记

本文介绍了C++编程的基础知识,包括文件类型、预处理指令、基本数据类型、输入输出操作、指针概念、函数结构等内容。

解决方案的文件类型

  • .sln:记录着关于解决方案中项目的信息。
  • .suo:其中记录着应用于该解决方案的用户选项。
  • .sdf:记录着与解决方案的Intellisense有关的数据。Intellisense是在Editor窗口中输入代码时提供自动完成的提示功能的工具。
  • .opensdf:记录着关于项目状态的信息。此文件只是在项目处于打开状态时才有。

#include指令。

该指令将stdafx.h文件的内容添加到这个文件中,以代替这条#include指令。在C++程序中,这是将.h源文件的内容添加到.cpp源文件的标准方法。
在项目属性General面板中选中Character Set属性。设置为Not Set。本地C++控制台程序,都应该这么做。

程序注释

/* Ex2_01.cpp */
使用//的注释只包括这一行中两个连续斜杠后面的部分,而//这种形式将包含在//之间的所有内容定义为注释,而且可以跨越几行。

#include指令–头文件

如果文件名是用尖括号括起来的,则编译器只搜索它预计查找标准文件的目录。因此,当您想要在源文件中包含一个标准头文件时,应该将文件名用尖括号括起来,因为这样的搜索速度更快。而当您要包含其他头文件,一般是自己创建的头文件时,则应该将文件名用双引号引起来:否则,根本找不到。

基本数据类型

  • 整形类型:int tempCount = 10;int tempCount(10);后面为函数表示法
  • 字符类型:char letter = ‘A’;char letter(‘A’);char letter = 65;由于字符’A’是由ASCII码表示的十进制数值65,因此可以如最后一种方法表示。
  • 宽字符类型:wchar_t = letter = L’Z’;wchar_t letter(0X5A);
    注意:不要写具有前置零的十进制整数值。编译器将把这样的值作为八进制(基数为8的数字系统)翻译,所以写成065的值将等同于正常十进制表示法中的53.

整形修饰符

如果确信不需要在变量中存储负值,则可以把变量指定为
unsigned,unsigned long mileage = 0UL;
浮点类型:double in_to_mm = 25.4;float pi = 3.14159f;

定义数据类型的同义词

typedef关键字能够使您为现有的类型定义自己的类型名称。typedef long int BigOnes;BigOnes mynum = 0L;同等于long int mynum = 0L;

具有特定值集的变量

enum Week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun} thisWeek;第一个名称值0,依次递增。

从键盘输入

std::cin >> num1 >> num2;忽略空白一次读取一个数字。

输出到命令行

std::cout << num1;将数字输出到命令行中。

赋值语句

whole = part1 + part2 + part3;连续赋值语句a = b = 2;

算术运算符号 + - * /

const修饰符

const double rollWidth = 21.0;表明变量不仅是double类型,而且是常量。
const double rollArea = rollWidth * rollLength;常量表达式,可由常量进行计算。

强制类型转换

static_cast(value);

查看类型

typeid(value).name();

位运算符

& 按位与(AND) 有0就为0否则为1
| 按位或(OR) 有1就为1否则为0
^ 按位异或(EOR) 全相同就为0否则就为1
~ 按位取反(NOT) (只需要一个操作数)1变0,0变1 value = ~value;
>> 右移 向右移动位数,出边界的丢失,尾部添0补充 value >>= 2;
<< 左移 向左移动位数,出边界的丢失,尾部添0补充 value <<= 2;

lvalue和rvalue

C++中每个表达式的结果或者是lvalue,或者是rvalue。有时,他们也分别写作l-value和r-value,但读音不变。lvalue指的是内存中持续存储数据的一个地址。而rvalue是临时存储的表达式结果。

存储时间

自动存储时间(出生于它被定义之时,在代码块结束时自动消失)
静态存储时间(从程序开始时存在,直到程序执行结束时为止)
动态存储时间

作用域解析运算符

作用域解析运算符(::)

using命名空间

using namespace std;将来自std名称空间的所有名称导入源文件
using std::cout;导入单个名称

声明数组

long height[6];height[5] = 3;
int cubic_inches[5] = {200, 250, 300, 350, 400};
long data[100] = {0};将100个元素初始化为0。
int value[] = {2, 3, 4};初始化3个长度的数组。

字符数组

char movie_star[15] = “Marilyn Monroe”;
char president[] = “Ulysses Grant”;
wchar_t president[] = L”Ulysses Grant”;创建由Unicode字符组成的字符串。
long data[2][4] = {{1, 2, 3, 5}, {7, 11, 13, 17}};多维数组

指针的概念

用来存储数据的各个内存位置都有地址。地址给PC硬件提供了引用具体数据项的途径。指针变量存储特定类型的另一个变量的地址。就像其他变量一样,指针变量也有名称,而且指针还有类型,以指出其内容引用的是什么类型的变量。注意,指针变量的类型隐含着该变量是指针的事实。如果某个指针变量可以保存包含int类型值的位置的地址,则该变量的类型是“指向int”类型的指针。

声明指针*

long* pnumber;在C++中,使用以字母p开始的变量名表示指针是通用惯例。

取值运算符&

pnumber = &number;用于获得变量的地址。

间接寻址运算符*

*pnumber += 1;

初始化指针,使用指针必须初始化,最好在其声明的时候就直接初始化。

int number = 10;
int* pnumber = &number;
int* pnumber = nullptr;//赋值空指针。

sizeof操作符,获取内存占用大小。

指针使用注意

不能修改被指向的对象,但可以使指针指向其他对象:const char* pstring = “Some text”;
不能修改指针中存储地址,但可以修改指针指向的对象:char* const pstring = “Some text”;
指针和被指向的对象都被定义成常量,因此都不能被修改:const char* const pstring = “Some text”;

函数结构

函数头
double power(double x,int n)
返回值类型(本例中是double)
函数名(本例中是power)
圆括号中的函数形参(本例中是x和n,分别为double和int类型)
函数体

在函数调用中实参会替换函数定义中出现的形参。

函数原型

函数原型给编译器提供了检查我们是否在正确使用函数而需要的基本信息。函数原型指定要传递给函数的形参、函数名和返回值类型,基本上包含出现在函数头中的相同信息,只是增加一个分号。显然,函数定义中函数头包含的形参数量和类型必须与函数原型相同。

给函数传递实参

按值传递机制:在按值传递机制中,我们指定的变量、常量或表达式值作为实参根本没有被传递给函数。而是创建这些实参的副本,并将这些副本作为被传递的值。按值传递机制的后果之一是函数不能直接修改被传递的实参。
给函数传递指针实参:当使用指针作为实参时,按值传递机制仍然像以前一样工作。但指针是另一个变量的地址,如果创建该地址的副本,则副本仍然指向相同的变量。

int incr10(int* num);
int* pnum = &num;int result = incr10(pnum);

数组是唯一不能按值传递的类型:编译器将数组名转换为指针,指向数组头部的指针副本通过按值传递机制被传递给函数。

double average(double* array, int count);
double values[] = {1.0, 2.0, 3.0, 4.0, 5.0};
average(values, (sizeof values)/(sizeof vlaues[0]));
double average(double* array, int count) {
    double sum = 0.0;
    for(int i = 0; i < count; i++) {
        sum += *array++;
    }
    return sum/count;
}

按引用传递

将函数的某个形参指定为引用,将改变给该形参传递数据的方法。使用的方法不是按值传递-其中在传递给函数之前复制实参,而是按引用传递,即形参扮演被传递实参的别名角色。该机制消除了对提供的实参的任何复制工作,允许函数直接访问调用函数中的实参。同时意味着,传递和使用指向值的指针时所需的取消引用操作也是多余的。

int incr10(int& num);
int value = 6;
result = incr10(value);
int incr10(int& num) {
    num += 10;
    return num;
}

使用const修饰符

可以给函数的形参使用const修饰符,以告诉编译器我们不想以任何方式修改这个形参。
int incr10(const int& num);

rvalue形参

具有rvalue引用形参的函数只能被rvalue实参调用。
int incr10(int&& num);
result = incr10(value + num);result = incr10(5);

返回指针

永远不要从函数中返回局部自动变量的地址。
return &value;

double* treble(double data) {
    double* result = new double(0.0);
    *result = 3.0 * data;
    return result;
}

返回引用指针

lowest(array, len) = 6.9;
double& lowest(double a[], int len) {
    int j(0);
    for(int i = 1; i < len; i++) {
        if(a[j] > a[i]) {
            j = i;
        }
    }
    return a[j];
}

函数中的静态变量

例如,计算调用函数的次数。

static int count = 0;

声明函数指针

double (pfun)(char, int);
包围指针名称pfun的圆括号和星号都是必不可少的。

long (*pdo_it)(long, long);
pdo_it(3, 5);

以函数指针作为实参

double sumarray(double array[], int len, double (*pfun)(double)) {
    double total = 0.0;
    for(int i = 0; i < len; i++) {
        total += pfun(array[i]);
    }
    return total;
}

函数指针的数组

double sum(double, double);
double product(double, double);
double (*pfun[2])(double, double) = {sum, product};
pfun[0](2.5, 3.5);

初始化函数形参

void showit(const char message[] = “Something is wrong”);

异常

try
{

throw “Message”;
}
catch(const char eMessage[])
{

}

捕获任何异常

catch(…)
{

}

函数模板

template<class T> T max(T x[], int len) {
    T maximum(x[0]);
    for(int i = 1; i < len; i++) {
        if(maximum < x[i])
        maximum = x[i];
    }
    return maximum;
}
float max(float, int);

使用decltype操作符

数据结构

struct BOOK {
    char Title[80];
    char Author[80];
    char Publisher[80];
    int Year;
};

访问结构的成员

成员选择操作符号“.”

指针访问结构

RECT aRect = {0, 0, 100, 100};
RECT* pRect(&aRect);
(*pRect).Top += 10;

内联函数

在函数头前面加上关键字inline;

内容概要:本研究针对微电网在遭受拒绝服务(DoS)攻击时面临的功率分配不均与电能质量问题,提出了一种兼顾功率精确均分与电压频率质量恢复的抗攻击混合动态事件触发二次控制策略。该策略通过设计新型混合动态事件触发机制,有效减少控制器与分布式单元间的网络通信负担,同时增强系统对DoS攻击的鲁棒性。研究构建了完整的微电网二次控制框架,整合了分布式协同控制算法与事件触发通信机制,在保证系统稳定性的同时,实现了对频率、电压偏差的快速调节和有功/无功功率的精确分配。通过Simulink平台进行仿真实验,验证了所提方法在遭受DoS攻击及正常运行工况下均能有效维持微电网的稳定运行与高质量电能输出。; 适合人群:具备电力系统自动化、分布式控制或微电网相关基础知识,从事新能源、智能电网领域研究的研发人员及高年级研究生。; 使用场景及目标:① 解决微电网在通信受限及网络攻击场景下的协同控制难题;② 实现微电网在异常工况下功率均分与电能质量的双重优化;③ 为设计高安全性、高可靠性的智能微电网控制系统提供理论依据与仿真验证方案。; 阅读建议:本资源侧重于控制策略的设计与仿真验证,建议读者结合微电网基础理论与Simulink仿真技术,深入理解事件触发机制与抗DoS攻击控制算法的实现细节,并动手复现仿真案例以加深对系统动态性能与鲁棒性的认识。
内容概要:本文围绕《【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)》展开,系统阐述了采用粒子群优化算法(PSO)对风能与水力发电系统进行联合优化调度的研究方法与技术路径。研究聚焦于构建多能源互补协调的优化模型,详细论述了目标函数的设计、系统约束条件的处理、算法求解流程及收敛性分析,并通过Matlab编程实现了完整的仿真验证过程,有效提升了可再生能源系统的运行效率与稳定性。该工作属于电力系统智能优化领域,强调对高水平期刊论文的高精度复现,兼具理论深度与工程实用性,适用于科研复现、学术研究与教学参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源优化调度、智能算法应用的工程技术人员。; 使用场景及目标:①用于复现《太阳能学报》等高水平期刊中关于风-水电联合调度的EI/SCI论文;②掌握粒子群算法在多源协同优化中的建模、编码与求解关键技术;③辅助完成学位论文、科研项目申报或学术竞赛中的仿真建模任务; 阅读建议:建议结合文中提供的网盘资源下载完整代码与文档资料,按照目录结构循序渐进学习,重点关注算法实现细节、电力系统建模逻辑与参数设置方法,同时可延伸学习灰狼优化算法、YALMIP工具包等先进优化技术,以全面提升科研仿真与创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值