const对象,NULL和nullptr,C++中创建对象数组

简介:  1.定义成了const之后的类 #include <iostream>class area{public: int x; int y; mutable int z; //不受const约束的类成员 area() :x(10), y(10), z(2) { } void printxy()const //不可以访问类中局部变量


1.定义成了const之后的类

#include <iostream>
class area
{
public:
	int x;
	int y;
	mutable int z;  //不受const约束的类成员
	area() :x(10), y(10), z(2)
	{
		
	}
	void printxy()const  //不可以访问类中局部变量
	{
		z = z + 1;
		std::cout << x << "  " << y  << "  " <<  z  << "\n";
	}
	void add(int a)
	{
		x += a;
		y -= a;
	}
	void go()const
	{
	}
protected:
private:
};

void main()
{
	//const对象不可以引用非const成员函数
	//不可以改变内部变量,mutable例外
	const area * const p = new area;
	p->go();
	//p->add();
	//p = new area;//指针可以改变

	const area area1;
	area1.printxy();
	//area1.add(1);
	area1.go();
	//area1.x = 10;
	//这一句说明当把类定义成const之后,定义成了mutable的值z可以修改
	area1.z += 4;
	area1.printxy();
	std::cin.get();
}

运行结果:

2.NULLnullptr

#include <iostream>

void go(int num)
{
	std::cout << "gonum" << std::endl;
}

void go(void *p)
{
	std::cout << "gop" << std::endl;
}

//C++中的NULL的类型是int ,0
void main()
{
	//C++是强类型,严格的类型检查
	void *p = nullptr;//C++的null
	go(p);   //结果为gop  //根据类型来处理
	go(NULL);  //会调用go(int num)  结果为gonum
	go(nullptr);  //结果为gop
	std::cin.get();
}

3.QTbuttonLine_edit操作相关的

QString  str1=ui->lineEdit->text();
QString  str2=ui->lineEdit_2->text();
QString str3=str1+str2;
ui->lineEdit_3->setText(str3);

QString  str1=ui->lineEdit->text();//获取文本
QString  str2=ui->lineEdit_2->text();
int  db1=str1.toInt();
int  db2=str2.toInt();//转换
int  db3=db1+db2;
QString str3;
str3.setNum(db3);//函数可以重载,很多个类型
ui->lineEdit_4->setText(str3);//设置文本

将QString转换成为字符串的是:str3.toStdString().c_str;

4.new deletemallocfree相关

#include<iostream>
#include <stdlib.h>

class myclassA
{
public:
	myclassA()
	{
		std::cout << "create\n";
	}
	~myclassA()
	{
		std::cout << "delete\n";
	}
protected:
private:
};

void main()
{
	//new delete自动调用构造析构
	myclassA *p = new myclassA;
	delete p;

	//只会分配内存,释放内存,不会对内存进行操作
	myclassA *p1 = (myclassA *)malloc(sizeof(myclassA));
	free(p1);
	std::cin.get();
}

案例2

</pre><pre class="cpp" name="code">#include<iostream>

class myclass
{
public:
	int x;
	int y;
public:
	myclass(int a, int b) :x(a), y(b)
	{
		std::cout << "构造哦" << std::endl;
	}
	myclass()
	{
	}
	~myclass()
	{
		std::cout << "销毁哦" << std::endl;//
	}

public:
	void printxy();
protected:
private:
};
void myclass::printxy()
{
	std::cout << x << "  " << y << std::endl;
}
myclass class1(10, 11);//全局变量优先main函数
myclass class2(11, 12);

void change1(myclass **pp)
{
	*pp = &class2;
}
void change2(myclass * &p)
{
	p = &class1;
}

void  main22()
{
	myclass *p = &class1;
	p->printxy();
	change1(&p);
	p->printxy();
	change2(p);
	p->printxy();
	std::cin.get();
}

void main11()
{
	//myclass *p = new myclass;
	myclass *p(new myclass(10, 9));//构造函数初始化
	p->printxy();
	myclass  class1(20, 1);
	myclass ** pp = &p;//二级指针存储一级指针的地址
	(*pp)->printxy();//一级类指针
	(**pp).printxy();//0级类指针
	std::cin.get();
}

void main122()
{
	//myclass *p = (myclass *)malloc(sizeof(myclass));
	//free(p);
	myclass *p = new myclass;
	delete p;

	std::cin.get();
}
5.创建对象数组

#include "dialog.h"
#include <QApplication>

class morewindow
{
public:
    Dialog *p[5];
    morewindow()
    {
        for(int i=0;i<5;i++)
         {
             p[i]=new Dialog;
             p[i]->show();
             p[i]->move(i*100,i*100);
         }
    }
    ~morewindow()
    {
        for(int i = 0;i<5;i++)
        {
            delete p[i];
        }
    }
    Dialog * operator [](int i)
    {
        return p[i];
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    morewindow more1;
    more1[3]->hide();//重载下标

    return a.exec();
}

6.创建对象数组

#include "mainwindow.h"
#include <QApplication>
#include<QDebug>

class morewindows
{
public:
    MainWindow *p[5];//指针数组,每一个元素是指针
    morewindows()
    {
        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(i*100,i*100);
        }
    }
    ~morewindows()
    {
        for(int i=0;i<5;i++)
        {
           delete p[i];
        }
    }
};

class morewindowss
{
public:
    MainWindow *p[5][4];
    morewindowss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
                p[i][j]=new MainWindow;
                p[i][j]->show();
                p[i][j]->move(i*130,j*130);
            }
        }
    }
    ~morewindowss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
              delete p[i][j];
            }
        }
    }
};

//int a[5]   int *p=a;   int *p= new int[5];
//int *a[5]   int **p=a  int **p=new  (int *)[5];
//int  *a[3][5]
//int * (*p)[5]

class morewindowsss
{
public:
    MainWindow  **p;//二级指针
    morewindowsss()
    {
       // p= (MainWindow **)malloc(sizeof(MainWindow *)*5);
    }
    void init(int num)
    {
        p= new MainWindow * [5];//new的时候类型不需要加上括号

        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(num*100,i*100);
        }
    }
    
    void move(int x,int y)
    {
        for(int i=0;i<5;i++)
        {

            p[i]->move(x*100,y*100);
        }
    }
    morewindowsss  & operator = (morewindowsss const & more)//自己写的深拷贝
    {
        qDebug()<<"shen";
        this->p = new MainWindow * [5];

        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(500,i*100);
        }
        return *this;
    }
    ~morewindowsss()
    {
        for(int i=0;i<5;i++)
        {
           delete p[i];

        }
        delete [] p;
       // free(p);
    }
};

class morewindowssss
{
public:
   // MainWindow *p[5][4];//二维数组,每一个元素都是指针
    MainWindow  **pA;//二级指针
    MainWindow *(*p)[4];//指向二维指针数组的指针
    morewindowssss()
    {
        pA=new  MainWindow  *[20];//一维数组
        p=(MainWindow *(*)[4])  pA;

        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
                p[i][j]=new MainWindow;
                p[i][j]->show();
                p[i][j]->move(i*130,j*130);
            }
        }
    }
    ~morewindowssss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
              delete p[i][j];
            }
        }
        delete [] pA;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    morewindowsss   more1;
    more1.init(1);
    // more1.move(1,2);

    morewindowsss   more2;//拷贝构造
    more2=more1;//赋值

    // morewindowsss   more2(more1);
    more2.move(3,4);

    return a.exec();
}

 
目录
相关文章
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
10月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
9月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
9月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
9月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
11月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
223 19
|
11月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
407 13
|
11月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
230 5
|
10月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
10月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。