关于c++传值的疑问

725137 2013-08-28 05:59:25
我一般这么写:


class Student
{
public:

int age;
char * name;
void set(int age, char* name)
{
this->age = age;
this->name = name;
}
};


搞不懂有些人为什么要这样写,有意思吗?

class Student
{
public:

int age;
char * name;
void set(int age, char* name)
{
this->age = age;
int len = strlen(name);
this->name = new char[len+1];
strcpy(this->name,name);
}
};

...全文
332 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
725137 2013-08-28
  • 打赏
  • 举报
回复

int main(int argc, char* argv[])
{
    char * n = "abcddefg";
 
    Student st ;
    st.set(18,n);
    (*n) = 'x';
	
    cout<<st.age<<st.name<<endl;
    cout<<&(st.name)<<endl;
    cout<<(*n) <<endl;
 
    return 0;
}
为什么如果是指针的话,通过指针去将第一个字符变成x,程序就会崩溃呢?
725137 2013-08-28
  • 打赏
  • 举报
回复
嗯。已经明白了。int是按值传递的。char*是默认的是传首地址。感谢
725137 2013-08-28
  • 打赏
  • 举报
回复
引用 3 楼 pengjialaosan 的回复:
个人认为:为安全起见还是第二种好点。 比如,如果第一种写法: char * myName = new char[20]; ...//给myName赋值 Student me; me.set(25, myName); //此时me.name是OK的,其与myName指向同一块内存 delete [] myName; //此时myName被释放,me.name因为指向同一块内存,此时成为传说中的野指针。
嗯。刚刚按这种方法测试了,如果是在外面动态分配的话,是会导致野指针。但是我还是不太明白,为什么只对char*这种有效。如果是new的int的话,为什么又不会导致野指针了呢?
大尾巴猫 2013-08-28
  • 打赏
  • 举报
回复
第一种不好,name依赖类外部的变量。如果几十个student,外面还要用一个数组来保存这些name的字符串。不合理。 第二种,name是保存了,但是set的实现有问题。 通常,student都应该有个 student(int age, char* name)的构造函数,还应该有相应的拷贝构造,所以很有可能name已经分配过内存了,set当中应该先delete this->name,然后再new和strcpy。 我个人认为,name应该设计成 char name[20]这样的静态数组,通常名字的长度有限,直接用字符数组更方便一些。这样不用new delete,效率更好。拷贝构造和赋值重载也不要写。
725137 2013-08-28
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
上面的写法是把传进来的name地址赋值给成员的name 下面的写法是自己分配内存空间来保存name的值! 具体要写什么写法,看实际工作需求了
问题是我测试过后,

int main(int argc, char* argv[])
{
	char * n = "zou";

	Student st ;
	st.set(18,n);
	n = "quan";
	cout<<st.age<<st.name<<endl;
	cout<<&(st.name)<<endl;
	cout<<&(n)<<endl;

	return 0;
}
打印后的地址根本不是我传入的那个参数地址,这里是按值传递的,并不是按地址传的。
starytx 2013-08-28
  • 打赏
  • 举报
回复
你的疑问也就是为什么有的人要给字符指针开辟空间,因为照你的写法,只是将外部的那个字符指针地址保存了下来,如果外部的字符空间失效(比如释放了),那你保存的这个指针还有什么用呢,所以保险的做法就是自己开辟自己的空间然后复制外部的字符串值到自己的空间中。也看具体应用,有时候是需要你的写法的。
彭家老三 2013-08-28
  • 打赏
  • 举报
回复
个人认为:为安全起见还是第二种好点。 比如,如果第一种写法: char * myName = new char[20]; ...//给myName赋值 Student me; me.set(25, myName); //此时me.name是OK的,其与myName指向同一块内存 delete [] myName; //此时myName被释放,me.name因为指向同一块内存,此时成为传说中的野指针。
freelancer_ex 2013-08-28
  • 打赏
  • 举报
回复
第一种写法name的生命期由调用的人控制 第二Student负责分配、释放name
max_min_ 2013-08-28
  • 打赏
  • 举报
回复
上面的写法是把传进来的name地址赋值给成员的name 下面的写法是自己分配内存空间来保存name的值! 具体要写什么写法,看实际工作需求了
modyaj 2013-08-28
  • 打赏
  • 举报
回复
第一种 方便 第二种 安全
qq120848369 2013-08-28
  • 打赏
  • 举报
回复
holds or has, is a question.
gdlk159 2013-08-28
  • 打赏
  • 举报
回复
常量字符串..........你到底要干什么?
内容概要:本文围绕基于NSGA-2算法的电-热-气综合需求响应(IDR)在综合能源系统中的多目标优化问题展开研究,提出了一种融合智能优化算法与能源系统协同调度的解决方案。研究系统性地构建了包含电力、热力与天然气多能耦合的综合能源系统模型,设计了以能效提升、运行成本降低和环境效益优化为目标的多目标优化框架,并采用NSGA-2算法求解该复杂非线性优化问题,获得Pareto最优解集。文中详细阐述了IDR机制建模方法、多目标优化问题的数学建模过程以及NSGA-2算法的关键实现步骤,包括编码方式、交叉变异策略与非支配排序机制,并通过Matlab代码实现了完整的仿真验证流程,展示了该方法在平衡多个冲突目标方面的优越性能。; 适合人群:具备电力系统、能源系统建模或优化算法基础的研究生、科研人员及工程技术人员,特别适用于从事综合能源系统规划、需求响应策略设计、多目标进化算法应用等相关领域的研究人员; 使用场景及目标:①应用于综合能源系统的运行优化与规划决策,支持多能互补场景下的协同调度分析;②为科研工作者提供NSGA-2算法在能源系统中实际应用的完整Matlab代码实现范例,助力学术论文复现、算法改进与模型拓展; 阅读建议:建议读者结合文中提供的Matlab代码,按照系统建模、目标函数设计、约束处理到算法实现的研究脉络逐步学习,重点关注Pareto前沿的生成过程、多目标权衡分析及算法参数敏感性,以深入掌握多目标进化算法在复杂能源系统优化中的工程化应用方法。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧