c++学习点滴6


一、构造函数

class NoName {
public:
	NoName();
	explicit NoName(const char *);
	NoName(const char *, int);
	NoName(const char *, int, double);
	NoName(const NoName&);

	virtual ~NoName();

protected:
	char *pstr;
	int ival;
	double dval;
private :
	void initNoName(const char *ps);
};

void NoName::initNoName(const char *ps) {
	if (ps) {
		pstr = new char[strlen(ps)+1];
		strcpy(pstr, ps);
	} else {
		pstr = new char[1];
		*pstr = '\0';
	}
}

NoName::NoName() {
	pstr = new char[1];
	*pstr = '\0';
	ival = 0;
	dval = 0;
}

NoName::NoName(const char *ps) {
	initNoName(ps);
	ival = 0;
	dval = 0;
}
NoName::NoName(const char *ps, int i) {
	initNoName(ps);
	ival = i;
	dval = 0;
}
NoName::NoName(const char *ps, int i, double d) {
	initNoName(ps);
	ival = i;
	dval = d;
}
NoName::NoName(const NoName &rhs) {
	initNoName(rhs.pstr);
	ival = rhs.ival;
	dval = rhs.dval;
}
NoName::~NoName() {
	delete pstr;
	pstr = 0;
	
}

使用带缺省值的构造函数:

class NoName {
public:
	NoName(const char *ps=0, int i =0, double d=0);
	NoName(const NoName&);

	virtual ~NoName();

protected:
	char *pstr;
	int ival;
	double dval;
private :
	void initNoName(const char *ps);
};

void NoName::initNoName(const char *ps) {
	if (ps) {
		pstr = new char[strlen(ps)+1];
		strcpy(pstr, ps);
	} else {
		pstr = new char[1];
		*pstr = '\0';
	}
}
NoName::NoName(const char *ps, int i, double d) {
	initNoName(ps);
	ival = i;
	dval = d;
}
NoName::NoName(const NoName &rhs) {
	initNoName(rhs.pstr);
	ival = rhs.ival;
	dval = rhs.dval;
}
NoName::~NoName() {
	if (pstr) {
		delete pstr;
		pstr = 0;
	}
}


二、初始化

// C++的数据成员中,只允许const static的数据成员在定义时被初始化
/*
class Test {
private:
	//int i = 0; // error
	//const int i = 0; // error
	//static int i = 0; // error
	const static int i = 0; // ok
};
*/

/*
class MyMember1  {
public :
	MyMember1(){}  // 有默认构造函数
};

class MyMember2 {
public :
	MyMember2(int i){}; // 没有默认构造器
};


// c++ 类的初始化分为隐式初始化、显示初始化、和计算部分(构造函数体内的所有语句)
// 隐式初始化包括: 1.调用所有父类的默认构造器  2.调用所有类成员的默认构造器
// 显示初始化,通过成员列表进行的初始化(推荐这样做)
// 计算部分,即位于构造器内部的所有语句
// 初始化顺序按照成员声明的顺序,而非初始化列表中的顺序。所以为了方便理解,我们要以成员声明的顺序去进行初始化
class MyClass {
public:
	MyClass(){} // 没有成员列表初始化
private :
	MyMember1 m1; // ok。能通过
	MyMember2 m2; // error。对于没有默认构造器的类成员,只能通过成员列表进行初始化
};
*/

/*
class MyMember1 {
public:
	MyMember1(int i){}
};
// 只能通过列表初始化的方式去初始化的情况:
// 1. const(非static)的成员
// 2. 引用成员
// 3. 没有默认构造函数的那些类成员
class MyClass {
public:
	MyClass() :i(100), ri(i), ci(200), m1(3){}
private:
	int i;
	int &ri;
	const int ci;
	MyMember1 m1;
};
*/


 

 三、extern关键字使用:

1. 在xx.cpp中定义函数和变量
int i10 = 10;

void fun(const char* str) {
	std::cout << "fun(): " << str << std::endl;
}

2. 在xx.h中用extern声明这些变量和函数
extern int i10;
extern void fun(const char* str);

3. 在别的yy.cpp中包含该xx.h头文件
#include "xx.h"
然后在yy.cpp中直接使用这些变量和函数
int main() {
	fun("allei");
	cout << "i10=" << i10 << endl;
	return 0;
}


 

 四、static关键字

1. static全局变量
  * 只能在本文件访问,对于其他文件不可见。其他文件中可以定义同名的变量而不会冲突。
   * 保存在全局数据区,默认初始化为0
   * 普通全局变量,可以通过extern在其他文件中引用

2. static 局部变量
   * 不会随着函数调用结束而释放,而是继续保留上次被调用的值。在全局数据区分配空间,在第一次调用时被初始化,后续调用不再进行初始化

3. static函数
  * 和普通函数的区别是只在本文件中可见,不能通过extern的方式被其他文件引用

4. class中的静态成员
  * 属于类而非类的对象


 

MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值