复数类的运算符重载加号和减号基础

本文详细介绍了在C++中如何通过运算符重载实现复数类对象间的加减运算,包括重载为成员函数和全局函数的方法,以及如何处理复数与实数之间的运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、重载运算符的目的:实现复数类对象之间直接进行运算,像基本数据类型一样。
二、运算符重载实质:编写以运算符作为名称的函数。
三、如何写:
返回值类型 operator运算符(形参表)
{
	具体实现代码
}
注:运算符可以被多次重载。运算符可以重载为全局函数,也可以重载为类的成员函数。重载为成员函数时,运算符左边通常是一个对象,this指针指向该对象。
四、复数类加减代码。
#include<iostream>
using namespace std;

//目的:实现对象之间的加减运算 
class Complex{
private:
	double real ,imag;
public:
	Complex(double r=0.0, double i=0.0):real(r),imag(i){}
	
	Complex operator-(const Complex& b);  //减号左边对象的成员函数,两个复数对象相减 
	Complex operator-(double r); //减号左边对象的成员函数,复数-实数 
	friend Complex operator-(double r, const Complex& a); //实数-复试 
	
	friend Complex operator+(const Complex& a,const Complex& b);//两个复数对象相加
	Complex operator+(const Complex& b);  //多次重载 复数+复数 
	Complex operator+(double r); //加号左边的对象的成员函数,复数+实数
	friend Complex operator+(double r, const Complex& a); //实数+复数
	
	Complex& operator=(const Complex& a); //左值对象的成员函数,重载赋值运算符 
	
	void myPrint();
};

//1.用类的成员函数实现运算符重载时,一个对象作为this实现调用成员函数,另一个对象作为参数 
Complex Complex::operator-(const Complex& b){
	return Complex(this->real-b.real,this->imag-b.imag); //创建临时对象返回 
}

Complex Complex::operator-(double r){
	return Complex(real-r,imag);
}

//实数-复数
//减号左边是一个实数,无法重载为成员函数,用友元重载为全局函数 
Complex operator-(double r, const Complex& a){
	return Complex(r-a.real,a.imag);
} 
 
//2.用全局函数实现运算符重载时,两个对象对应两个参数 
Complex operator+(const Complex& a,const Complex& b){
	return Complex(a.real+b.real,a.imag+b.imag);
}

Complex Complex::operator+(const Complex& b){
	return Complex(real+b.real,imag+b.imag);
}

Complex Complex::operator+(double r){
	return Complex(real+r,imag);
}

Complex operator+(double r, const Complex& a){
	return Complex(r+a.real,a.imag);
}

void Complex::myPrint(){
	cout << this->real << "+" << imag << "i" << endl;
}

Complex& Complex::operator=(const Complex& a){
	this->real = a.real;
	imag = a.imag;
	return *this;
}

void testAdd(){
	Complex a(4,4), b(1,1), c;
	c = a+b;        //两个复数相加,等价于a.operator+(b) 
	c.myPrint();
	Complex d = a + 2;  //复数+实数,a.operator+(2) 
	d.myPrint();
	Complex e = 3 + a;  //实数+复数,operator(3,a) 
	e.myPrint();
}

void testSub(){
	Complex a(4,4), b(1,1);
	Complex c = a-b;
	c.myPrint();
	Complex d = a - 2;
	d.myPrint();
	Complex e = 2- a;
	e.myPrint();
}

void testAss(){
	Complex a(4,4);
	Complex b, c;
	c = b = a;
	a.myPrint();
	b.myPrint();
	c.myPrint();
} 

int main(){
	testAdd();
	cout << "---------------------" << endl;
	testSub();
	cout << "----------------------" << endl;
	testAss();
	
	return 0;
}  
五、输出结果:

复数类

六、总结:

 1.赋值运算符只能重载为类的成员函数。
 2.重载为全局函数时,函数参数个数等于运算符的操作数个数;重载为成员函数时,函数参数个数等于运算符的操作数个数减一。
 3.对于全局函数,访问类的私有成员函数必须使用声明为类的友元函数。
 4、可以被重载的运算符如下:
在这里插入图片描述

sql添加表列字段描述添加默认值删除字段 //删除表 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[JHCRM_Report_ss]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [JHCRM_Report_ss] //添加表 if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) create table [Table1] ([col1] int,[col2] int) //添加字段 if not exists( select * from syscolumns where syscolumns.[name]='FNewObjectEnd' and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[jsc_financial]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE jsc_financial ADD FNewObjectEnd int--NULL --添加先用项目结项数 go EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'先用项目结项数' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'jsc_financial', @level2type=N'COLUMN',@level2name=N'FNewObjectEnd' if not exists( select * from syscolumns where syscolumns.[name]='Record_Money' and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[JHCRM_Resource_Record_Main]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE JHCRM_Resource_Record_Main ADD Record_Money numeric(12, 2)--NULL --资源费用 go EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'资源费用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'JHCRM_Resource_Record_Main', @level2type=N'COLUMN',@level2name=N'Record_Money' //删除字段 if not exists( select * from syscolumns where syscolumns.[name]=table_Name and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[tableName]')" and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE table_Name DROP COLUMN tableName
<think>首先,用户的问题很明确:如何在SQLServer中使用ALTERTABLE语句向现有表添加字段。我需要参考提供的引用来构建回答。引用内容回顾:-引用[1]:介绍了基本的ALTERTABLEADD语法。-引用[2]:更详细地说明了ALTERTABLE的用法,包括添加删除和修改列,并举了例子。强调了不同数据库系统的语法差异,但用户指定了SQLServer。-引用[3]:提醒SQLServer版本可能影响语法,要检查版本兼容性。特别是对SQLServer2000及更高版本的说明。用户的具体查询是:“我想在SQLServer中查找如何给表添加字段的方法或语法请问如何在SQLServer中通过ALTERTABLE语句为现有表添加字段”。所以,我需要聚焦在SQLServer上。回答结构:-根据系统级指令,回答必须结构清晰、逐步解决问题、真实可靠。-使用中文回答。-行内数学表达式用$...$(但这里可能不需要)。-独立公式用$$...$$(不适用)。-末尾添加引用标识。-生成相关问题。步骤:1.**引言**:直接回应用户的问题,确认SQLServer的ALTERTABLE语句。2.**语法介绍**:-使用引用[1]和[2]的基本语法:`ALTERTABLEtable_nameADDcolumn_namedata_type;`-强调SQLServer的特定语法,避免错误。引用[2]提到SQLServer用`ALTERCOLUMN`来修改数据类型,但添加新列用`ADD`。-引用[3]的警告:版本差异。建议用户确认SQLServer版本。3.**示例**:-提供一个清晰的代码块,展示添加字段SQL语句。-参考引用[2]的例子:ALTERTABLEPersonsADDDateOfBirthdate-调整为SQLServer的上下文。4.**注意事项**:-数据类型的选择。-默认值、NOTNULL约束等可选扩展。-权限和表锁定的影响。5.**结尾**:自然地添加引用标识。6.**生成相关问题**:基于指令,需要生成相关问题。完整回答框架:-解释基本语法。-给出示例代码。-注意事项部分。-相关问题。确保回答可靠:-基于引用[2]的详细解释。-提醒版本问题,如引用[3]。生成相关问题:-例如:1.如何在SQLServer添加带默认值的字段?2.SQLServer中ALTERTABLE添加列的限制是什么?3.如何修改现有列的数据类型在SQLServer中?-类似提供的示例结构。最终回答:-用户可见层:结构清晰,逐步指导。</think> ### 如何在 SQL Server 中通过 ALTER TABLE 语句为现有表添加字段SQL Server 中,使用 `ALTER TABLE` 语句向现有表添加字段(或称为列)是一种常见的数据定义语言(DDL)操作。我会逐步解释语法、提供示例,并说明注意事项,确保回答真实可靠。参考引用内容,SQL Server 的语法与其他数据库系统(如 MySQL 或 Oracle)有细微差异,因此我将重点关注 SQL Server 的特定实现[^1][^2][^3]。 #### 步骤 1: 理解基本语法 在 SQL Server 中,添加字段的基本语法如下: ```sql ALTER TABLE table_name ADD column_name data_type [CONSTRAINTS]; ``` - `table_name`:要修改的现有表的名称。 - `column_name`:要添加的新字段的名称。 - `data_type`:新字段的数据类型(如 `INT`, `VARCHAR(50)`, `DATE` 等)。 - `[CONSTRAINTS]`:可选约束,例如 `NOT NULL`、`DEFAULT` 值等(例如,`DEFAULT 'New Value'` 或 `NOT NULL`)。 重要注意事项: - 语法以 `ALTER TABLE` 开头,后跟表名和 `ADD` 子句。 - 参考引用[2],SQL Server添加字段时,通常不需要指定 `COLUMN` 关键字(与删除或修改列不同),直接使用 `ADD column_name data_type` 即可。 - 版本兼容性:SQL Server 2000 及更高版本支持此语法,但新版本(如 SQL Server 2016+)可能支持更多数据类型或约束。建议在执行前检查您的 SQL Server 版本(例如,使用 `SELECT @@VERSION`)以避免不兼容问题[^3]。 #### 步骤 2: 实际示例 假设您有一个名为 `Employees` 的表,您想添加一个 `BirthDate` 字段,类型为 `DATE`。以下是完整的 SQL 语句: ```sql -- 添加一个新字段 BirthDate,数据类型为 DATE ALTER TABLE Employees ADD BirthDate DATE; ``` - 如果添加成功,SQL Server 会返回命令完成的确认消息(如“Command(s) completed successfully.”)。 - 扩展示例:如果希望新字段不能为空,并设置默认值(例如默认为当前日期),可以这样写: ```sql ALTER TABLE Employees ADD JoinDate DATE NOT NULL DEFAULT GETDATE(); ``` - 这里 `NOT NULL` 确保该字段必须有值,`DEFAULT GETDATE()` 在插入新行时自动使用当前日期。 #### 步骤 3: 注意事项 - **数据类型选择**:确保 `data_type` 与字段用途匹配。例如: - 整数用 `INT`。 - 文本用 `VARCHAR(n)`(其中 `n` 是最大长度)。 - 日期用 `DATE` 或 `DATETIME`。 - **约束和索引**: - 添加字段后,如果需要索引或唯一约束,可以额外使用 `CREATE INDEX` 或 `ALTER TABLE ADD CONSTRAINT`。 - **性能影响**: - 在大型表上添加字段可能导致锁定,进而阻塞其他操作。建议在低峰期执行,或使用在线操作(如 SQL Server 2016+ 的 `WITH (ONLINE = ON)`)。 - 测试在开发环境:先在测试表上运行,避免生产环境错误。 - **权限要求**:您需要表级别的 `ALTER` 权限(通常由数据库管理员授予)。 通过以上步骤,您可以安全地在 SQL Server添加字段。如果语法执行出错,检查字段名是否与现有列冲突,或数据类型是否受支持(例如,引用[2]中提到的年份类型 `YEAR` 在 SQL Server 中不支持,需改用 `DATE` 或 `DATETIME`)。总之,`ALTER TABLE ADD` 是高效的表结构调整方式[^1][^2]。 参考文献: - 引用[1]:sql语句 向现有的表中添加字段。要向现有的表中添加字段,你可以使用 SQL 的ALTER TABLE语句。以下是添加字段的语法: ALTER TABLE table_name ADD column_name data_type;。 - 引用[2]:SQL ALTER TABLE 语句用于在现有表中添加删除或修改列。ALTER TABLE 语句  ALTER TABLE 语句用于在现有表中添加删除或修改列。 1.若要向表中添加列,请使用以下语法: ALTER TABLE table_name ADD column_name datatype。 - 引用[3]: SQL结构化查询语言应用基础--DDL篇--SQL Server数据库开发之ALTER TABLE修改表语句使用详解。但是有一点大家要注意一下, ALTER TABLE 语句在一些SQL Server 2000 及更高版本中,这个语句的基本语法是相似的, 但是可能随着版本的更新和提高,支持的功能和语法细节可能会有所不同!。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值