类会默认产生的成员函数
来源:互联网 发布:c语言绚丽表白代码 编辑:程序博客网 时间:2024/05/01 14:43
说明:代码来自<<程序员面试宝典>>
#include<iostream>using namespace std;class String{public: String(const char *str);//构造函数,str是传入的参数 ~String();//析构函数 String(const String &other);//拷贝构造函数 String& operator=(const String &other);//赋值函数 private: char *m_data;};String::String(const char *str){ if(NULL==str)//没有传入字符串 { m_data=new char[1];//申请一个空间来存放\0,表示空串 *m_data='\0'; } else { m_data=new char[strlen(str)+1]; strcpy(m_data,str); //将字符串内容复制到指针所指向的内存空间 }}String::~String(){ delete []m_data;}String::String(const String &other)//相当于对一个新的实例进行初始化化,other表示提供值的哪一个实例{ if(other.m_data==NULL)//判断指针是否为空 { m_data=new char[1]; *m_data='\0'; } else { m_data=new char[strlen(other.m_data)+1];//中间要求指针指向的那个字符的长度 strcpy(m_data,other.m_data); }}String::String::operator=(const String &other)//赋值函数{ //检查自赋值 if(this==&other) return *this; //释放原因内存资源 delete []m_data; //分配新的内存资源,并复制内容 int length=strlen(other.m_data); m_data=new char[length+1]; strcpy(m_data,other.m_data); return *this;//返回本对象的引用}C++中的赋值和拷贝:
拷贝:对未初始化的内存进行初始化工作。
String s1("hello"); String s2(s1)//或String s2=s1;
赋值:对已初始化的内存进行再操作(重新赋值)
String s1("hello"); String s2; String s2=s1;//s2已经被初始化过了,只不过初始化为空
int length=strlen(other.m_data)计算的是指针所指字符串长度而不是指针的长度。
注意sizeof和strlen
sizeof;C语言中判断数据类型或者表达式长度符(计算占用空间),是一个运算符,字节数的计算在程序的编译时进行,而不是在程序的执行过程中才算出来。(百度百科)
strlen:一个用来计数的函数,接收一个char *作为参数,碰到'\0'结束。所以必须是计算以'\0'结尾的(不包括'\0')。
#include<iostream>using namespace std;int main(){ char *str="123456"; cout<<str<<endl;//123456 cout<<sizeof(str)<<endl;//4,计算的指针的长度 cout<<strlen(str)<<endl;//6,计算指针指向的字符串的长度,不包括'\0' char str1[]="123456"; cout<<str1<<endl; cout<<sizeof(str1)<<endl;//7,计算整个字符串长度,包括'\0'(计算占用空间) cout<<sizeof(str1)<<endl;//6 return 0;}注意字符数组和指针指向的数组的区别。strlen一样,sizeof不一样。
赋值函数里面参数是cosnt
当other为const时,一个const变量不能随意转化为非const变量(拷贝构造函数也一样)。
String s3(hello);
Const string s4(haha);
s3=s4;
再看一段代码:
#include<iostream>using namespace std;class Parent{ public: Parent(char *str,int var=-1)//带有默认实参的要在后面 { m_data=str; n=var; } void getn() { cout<<n<<endl; } void getChar() { cout<<m_data<<endl; }private: int n; char *m_data;};class child:public Parent{ public: child(char *str,int var=1):Parent(str)//初始化父类的指针变量 { n=var; } void getn() { cout<<n<<endl; }private: int n;};int main(){ char *str="123"; child c1(str); c1.getn();//1 c1.Parent::getn();//-1 c1.getChar();//123 return 0;}父类的函数和变量不会因为同名而被子类覆盖,父类指针变量要指明初始化,其他变量可默认。
0 0
- 类会默认产生的成员函数
- 默认产生的类成员函数
- C++中的空类,默认产生的类成员函数
- 空类默认产生的类成员函数
- C++ 空类默认产生的类成员函数
- C++中的空类默认产生的类成员函数
- C++空类,编译器默认产生的成员函数
- C++空类默认产生的成员函数
- C++中一个空类默认产生的成员函数
- 空类中默认产生的成员函数
- C++编译器会为类产生哪些默认的成员方法?---聊聊C++的Big Three
- C++ 空类默认产生的成员
- c++-空类默认产生的成员
- C++ 类的成员函数定义在.h中为什么会产生函数重定义错误?
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 十一、构造函数和析构函数(五) 空类默认产生的成员
- C++中的空类,默认产生哪些类成员函数?
- 【leetcode】24. Swap Nodes in Pairs
- pthread_cancel用法及常见问题
- java设计模式之策略模式
- 欢迎使用CSDN-markdown编辑器
- 架构设计:系统间通信(33)——其他消息中间件及场景应用(下3)
- 类会默认产生的成员函数
- 功能树Ztree的使用
- 【Codeforces Round 354 (Div 2)E】【数学 多项式除法 讨论】The Last Fight Between Human and AI 多项式除以x-k是否值整除
- hive启动移除 java.lang.RuntimeException: java.lang.IllegalArgumentException: java.net.URISyntaxException
- Android UI性能优化实战 识别绘制中的性能问题
- Frament与activity生命周期对比
- Velocity 是一个基于 Java 的模板引擎
- 矩阵乘法(Strassen算法/C++实现)
- 第十九章 斐波那契堆