C++第七天笔记2016年02月24日(周三)P.M

1.    哪些构造函数支持做类型转换?

传递一个参数就可以被调用的构造函数。

2.    不同函数调用时间分析源码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Demo{
 5 public:
 6     Demo(int n=0):i(n){cout<<"默认构造函数被调用"<<endl;}
 7     Demo(const Demo& a)
 8     {
 9         i=a.i;
10         cout<<"拷贝构造函数被调用"<<endl;
11     }
12     ~Demo(){cout<<"构造函数被析构"<<endl;}
13     const Demo& operator=(const Demo& a)
14     {
15         this->i=a.i;
16         cout<<"赋值运算符重载被调用"<<endl;
17         return *this;
18     }
19     Demo& set_value(int n){i=n;return *this;}
20     int get_value(){return i;}
21 private:
22     int i;
23 };
24 Demo foo(Demo x){//函数被调用时,初始化新对象x会调用拷贝构造函数
25     Demo d;//声明对象d调用默认构造函数
26     return d;//以值的方式返回对象时,编译器会为返回值生成一个中间对象(即使用d拷贝生成新对象)会调用拷贝构造函数。
27 }//函数调用结束时,对象x和d的作用域结束,分别调用析构函数回收d和x的资源。
28 int main(int argc, const char * argv[]) {
29
30     Demo a(2);//声明对象a会调用默认构造函数
31     {
32         Demo b;//声明对象b时默认构造函数被调用
33         b=foo(a);
34         /*调用函数foo(跳转到foo函数处查看函数具体调用情况说明)。一旦函数调用结束,赋值重载函数会被调用(将右值赋值给左值)  赋值结束后,foo(a)表达式的值(即返回的中间对象)使用结束,会调用析构函数回收其资源。*/
35     }//块域结束,则对象b作用域结束,析构函数会被调用。
36     Demo c=a;//用一个已经存在的对象a创建并初始化新对象c 会调用拷贝构造函数
37     return 0;
38 }//main函数域结束,则对象a c作用域结束,会调用析构函数分别回收c a的资源

3.  构造函数类型转换:

 1 #include <iostream>
 2 #include "cstring"
 3 using namespace std;
 4
 5 class String
 6 {
 7 public:
 8     String():len(0),rep(new char[1]){
 9         strcpy(rep, "");
10     }
11     String(char* s)
12     {
13         if (!s) {
14             len=0;
15             rep=new char[1];
16             strcpy(rep, "");
17         }
18         else{
19             len=(int)strlen(s);
20             rep=new char[len+1];
21             strcpy(rep,s);
22         }
23     }
24     String(const String& str):len(str.len),rep(new char[str.len+1]){
25         strcpy(rep, str.rep);
26     }
27     ~String(){
28         delete [] rep;
29     }
30     friend void print(const String& s);
31 private:
32     char* rep;
33     int len;
34 };
35 void print(const String& s)
36 {
37     cout<<s.rep<<endl;
38 }
39 int main(int argc, const char * argv[]) {
40     char* a="aaaaaaaa";
41     print(a);
42     print("11111");
43     String b="bbbbbbbb";
44     print(b);
45     return 0;
46 }

4.  构造函数与对象数组源码:

 1 #include <iostream>
 2 #include "cstring"
 3 using namespace std;
 4 class Item
 5 {
 6 public:
 7     Item():name(new char[1]),id(0){strcpy(name, "");}
 8     Item(char* s,int i=0):id(i),name(new char[strlen(s)+1]){
 9         strcpy(name, s);
10     }
11     void set(char* s,int i){
12         if (name) {
13             delete [] name;
14             name=new char[strlen(s)+1];
15             strcpy(name, s);
16             id=i;
17         }
18     }
19     ~Item(){delete [] name;}
20     friend ostream& operator<<(ostream& out,const Item& i);
21 private:
22     char* name;
23     int id;
24 };
25
26 ostream& operator<<(ostream& out,const Item& i)
27 {
28     out<<endl<<i.name<<" "<<i.id;
29     return out;
30 }
31 int main(int argc, const char * argv[]) {
32     Item stat[2]={Item("pen",2334),Item("note",3155)};
33     Item meat[3]={"fd","dfs","rtfe"};
34     Item nothing[2];
35     Item* ptr=new Item[3];
36     for (int i=0; i<2; ++i) {
37         cout<<stat[i];
38     }
39     for (int i=0; i<3; ++i) {
40         cout<<meat[i];
41     }
42     for (int i=0; i<2; ++i) {
43         nothing[i].set("djkjdf", i+1);
44         cout<<nothing[i];
45     }
46     for (int i=0; i<3; ++i) {
47         ptr[i].set("dags", i+1);
48         cout<<ptr[i];
49     }
50     delete [] ptr;
51     return 0;
52 }

5. 补充:内存分析(第一次大作业)

#include <iostream>
#include"cstring"

using namespace std;

class Person
{
public:
    Person(char* _name="jack",int _age=0):name(new char[strlen(_name)+1]),age(_age){
        strcpy(name, _name);
    }
    ~Person(){
        cout<<"析构"<<endl;
        delete [] name;
    }
private:
    char* name;
    int age;
};

int main(int argc, const char * argv[]) {
    Person** elements=new Person*[5];//对象数组
    Person* p1=new Person;
    Person* p2=new Person;
    Person* p3=new Person;
    elements[0]=p1;
    elements[1]=p2;
    elements[2]=p3;
    delete [] elements;//只会回收elsments所指向的堆空间,不会调用析构函数。
    delete p1;//p1所指向的堆空间中存储的是对象,空间回收时对象被销毁,析构函数会被调用。
    delete p2;
    delete p3;
    return 0;
}

时间: 2024-10-09 22:17:07

C++第七天笔记2016年02月24日(周三)P.M的相关文章

C++第七天笔记2016年02月24日(周三)A.M

1.    拷贝构造函数:也是构造函数. 2.    拷贝构造的作用: (1). 用一个已经存在的对象创建并初始化新对象. 1 object=another_object; //赋值重载 2 Person object=another_object; //拷贝构造函数. 3 Person object(another_object); //开辟堆空间 1 Person obj; 2 Person* p=new Person(obj); //编辑器会调用拷贝构造函数. delete p; 3. 

OC第七天笔记2016年03月22日(周二)A.M

1. 可变字符串 NSMutableString* mstr = [[NSMutableString alloc] initWithCapacity:10]; 增 删 改 替换 //[mstr length] [mstr insertString:@"http://" atIndex:0]; //第一个参数:即将要插入的字符串 //第二个参数:插入的位置(下标) NSLog(@"%@",mstr); //http://www.baidu.com [mstr inse

C++第六天笔记2016年02月23日(周二)A.M

1.    赋值运算符的重载: 什么情况下需要赋值运算符的重载? 当类中有指向对空间的指针变量时,需要重载赋值运算符以实现深拷贝. 浅拷贝问题: 当类中有指向对空间的指针变量时,前拷贝有可能会导致二次删除或内存泄露问题. 重载赋值操作符分5步:a=a; 1.1  判断是否为自赋值à自赋值则直接跳至第5步. 1.2  删除旧的堆空间(指针指向的旧的堆空间) 1.3  申请新的堆空间 1.4  内容拷贝 1.5  return* this; 浅拷贝: 1 #include <iostream> 2

C++第五天笔记2016年02月22日(周一)P.M

1.    输出运算符重载: 1 #include <iostream> 2 #include"cstring" 3 4 using namespace std; 5 6 class Complex 7 { 8 public: 9 Complex(int r=0,int i=0):_r(r),_i(i){} 10 void print(); 11 friend ostream& operator<<(ostream& out,const Comp

C++第八天笔记2016年02月25日(周四)A.M

1.    继承:一个类A可以继承另一个类B,那么我们称类B为基类(父类),类A为派生类 (子类). 2.    派生类从基类继承了所有成员,除了构造函数.析构函数.=函数. 3.    基类的私有成员,虽然它们也是派生类的私有成员,但是不能在派生类中定义的成员函数访问.这些基类的私有成员只能通过基类的公有成员函数访问. 4.    子类可以自己实现与父类成员函数原型相同(函数名.参数列表)的成员函数,称为覆盖.覆盖是函数重载的特例,覆盖一定是发生在继承的过程中. 在子类中调用被覆盖的父类版本的

OC第七天笔记2016年03月21日(周一)P.M

1. 使用NsCompare 或者isEqualToNumber来实现NsNumber对象的比较. NsCompare:比较大小关系 isEqualToNumber:是否相等 长度:[str length] 查找子串: NSRange rr = [str rangeOfString:@”ll”]; If(rr.location == NSNotFound){ NSLog(@”ll is not in str ”); } else { NSLog(@”ll is in str”);}

C++第十天笔记2016年02月29日(周一)A.M

1.把子类对象作为父类对象使用: 1.1  前提:继承方式必须公有. 1.2 将子类对象用作父类对象. 1.2.1 将子类对象赋值给父类对象. 1.2.2 将父类引用指向子类对象.(即用派生类对象初始化基类引用) 1 #include <iostream> 2 using namespace std; 3 4 class Base{ 5 public: 6 Base(){} 7 Base(int b):_b(b){} 8 void func(){cout<<"b:&quo

C语言第七天笔记2016年01月21日(周四)P.M

1. 内存分配: C++里面使用new  delete 注意: #include <iostream> #include"stdlib.h" using namespace std; int main(int argc, char *argv[]) { int* p=new int(5); //申请了一个数组大小的堆空间,数组中的元素为int类型,元素个数为5. int* q=new int[5]; //申请了一个数组大小的堆空间,数组中的元素为int类型,元素个数为5.

OC第九天笔记2016年03月24日(周四)A.M

1.  打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc 2.  在ARC中内存回收由编译器完成 声明对象之后,未将对象置为nil,则对象作用域结束时,空间才会被回收:如果将对象置为nil,则对象的空间会立即回收. 3.  __strong __weak __strong:强引用,拥有某一块堆空间的所有权.默认. __weak:弱引用,仅拥有使用权. 一旦强引用置为nil,弱引用会被自动置为nil. 声明属性:如果属性为对象实例变量,赋值方式strong,否则使用weak